class A
{
public void F() { Console.WriteLine("A.F"); }
public virtual void G() { Console.WriteLine("A.G"); }
}
class B : A
{
new public void F() { Console.WriteLine("B.F"); }
public override void G() { Console.WriteLine("B.G"); }
}
class virtualMethod
{
internal static void main()
{
B b = new B();
A a = b;//什么意思?对象a就是对象b了吗?
a.F();//为什么要输出A.F,它不是相当于b.F()吗
b.F();
a.G();//a到底是A的对象还是B的对象?
b.G();
}
} 产生的输出:
A.F
B.F
B.G
B.G
class virtualMethod
{
internal static void main()
{
B b = new B();
//这儿仅仅是将b的引用复制给a,a和b这时候指向内存中同一个地址。
A a = b;//什么意思?对象a就是对象b了吗?
//b中的F()使用了new关键字,相当于b有二个F()方法。
a.F();//为什么要输出A.F,它不是相当于b.F()吗
b.F();
//a在内存中的方法表是A的不是b的。
a.G();//a到底是A的对象还是B的对象?
b.G();
}
} 上面的代码主要考查了对面向对象中继承、对象实例化等知识点。
代码在编译时会创建二个方法表,一个是A.MethodTable,里面包括A类中的所有方法。一个是B.MethodTable,里面包括的是B类的方法。在内存中大概是这样的:
A:
A.F()
A.G()
B:
B.F()//直接继承父类的F()方法
B.F()//这个是new关键字创建的,没有覆盖掉父类的F()方法。
B.G()//对父类方法G()的重载。