using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
class Program
{
public class A
{
public A()
{
Console.WriteLine("construct in A");
} public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B : A
{
public B()
{
Console.WriteLine("construct in B");
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
}
static void Main(string[] args)
{
A a = new B();
a.Fun();
}
}
}
问题1,我的理解是这里是重载.
问题2,a对象是B类型,为什么A a(这里是转换类型么?)之后调用Fun()不能调用的不是自己的Fun();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
class Program
{
public class A
{
public A()
{
Console.WriteLine("construct in A");
} public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B : A
{
public B()
{
Console.WriteLine("construct in B");
}
public override void Fun()
{
Console.WriteLine("B.Fun()");
}
}
static void Main(string[] args)
{
A a = new B();
a.Fun();
}
}
}
问题3,按照程序的正确结果来推理,把a转换成A类型之后,是如何实现调用A类型的Fun(),怎样转换成override的B里面的Fun();
我理解既不是重载也不是重写,而是2个除了名字一样,完全无关的方法问题2,a对象是B类型,为什么A a(这里是转换类型么?)之后调用Fun()不能调用的不是自己的Fun();
因为用了new关键字,A类型的fun和B的fun就不是同一个方法,编译器不会通过多态的机制动态绑定,而是直接在编译时指定了A类型的fun方法问题3,按照程序的正确结果来推理,把a转换成A类型之后,是如何实现调用A类型的Fun(),怎样转换成override的B里面的Fun();
override,这里是重写了,就通过多态机制在运行时动态绑定了
new关键字可以省略,当然你会被编译器警告问题2.很好理解。你用了new之后那个B类没有任何多态性质了,没有虚函数表了,无法动态绑定函数了。
A a = new B();
a.Func()是静态绑定的。Func()在编译期已经决定了是A.Func()问题3. 动态绑定
编译器只是编译为调用a引用的instance的虚函数表里的Func方法
实际运行时,a引用的是B的instance,所以调用的是B的Func方法