如下例:
using System;
class A
{
   public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
   public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
   new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
   public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
   static void Main() {
      D d = new D();
      A a = d;
      B b = d;
      C c = d;
      a.F();
      b.F();
      c.F();
      d.F();
   }
}
输出结果:
B.F
B.F
D.F
D.F
最后一个结果没有什么说的,
1。前面3个结果为什么是这样?
2。a,b,c,d四个对象中各自包含的成员以及方法(包括继承过来的)是什么样子的?有没有相关工具可以查看对象包含的实际成员变量和方法的工具啊
3。c#中的多态和函数隐藏与c++的一样吗?
4。函数隐藏后,子类对象中不存在该方法还是存在该方法但是不能访问?
谢谢大家先!

解决方案 »

  1.   

    1. 当然应该是这样,为什么不应该是这样?2. 查看实际.....就是简单的调试——设置断点然后中断之后分析变量和堆栈。不会调试,程序员就白当了。只有不是人间烟火的那种大师可以开发时不用调试,而是全凭猜测和冥想来了解软件的内部运行状态。3. 对方法的继承实现机制不一样,忘记c++的实现最好。不过要实现的功能基本一样。你问的问题非常不具体,不知道你是问底层实现方法还是要达到的功能,似乎怎么简单回答都能挑出很明显的不对。有一本书叫做《.net本质论》的主要讲这些底层的差异。4. 存在。你不是从实际输出中看到B.F和D.F两个结果了吗?
      

  2.   

    1、基类中被改写
    D d = new D();
    A a=new A();
    B b=new B();
    C c=new C();
    // D d=new D();
    // A a = d;
    // B b = d;
    // C c = d;
    a.F();
    b.F();
    c.F();
    d.F();
    这样,就是自己virtual 关键字,他就不再查询基类,使用base.时候
    修改一下D,
    class D: C
    {
    public override void F() 
    {
    base.F();
    // Console.WriteLine("D.F");
    }

      

  3.   

    如果你的输出结果是正确的,那么就说明override管用..(毕竟叫改写嘛不是叫着玩的)如果你给出的执行结果正确(我没试过)那么说明只有在一个函数(方法)在其子类族中没有被必定时才会执行virtual(缺省)的那个函数.
      

  4.   

    我也知道多态,但是查看相关文档后可能把C++的多态与C#弄混淆了
    其实问了这么多只要知道a,b,c,d四个对象的内存结构就一目了然了,所以请各位指点一下,我有点乱了。
    问题就是:a,b,c,d四个对象的内存结构和各自虚拟函数表存储的函数地址情况。
    谢谢!