class PersonnelV
{
public virtual void Visit(Officer o)
{
Console.WriteLine("I am Officer");
}
public virtual void Visit(Personnel p)
{
Console.WriteLine("Personnel");
}
}
class Personnel
{
public virtual void Accept(PersonnelV v)
{
v.Visit(this);
}
}
class Officer : Personnel
{
// public override void Accept(PersonnelV v)
// {
// v.Visit(this);
// }
}
      
         class Test
         {    
public static void main()
{
Officer p = new Officer();
p.Accept(new PersonnelV());
}
         }

解决方案 »

  1.   

    输出结果是 Personnel因为一个virtual函数,如果你不在子类里override的话,那么子类就自动继承父类的函数的实现。
      

  2.   

    C#中有子类有两种方式改写超类的方法
    一、超类的非virtual方法,子类用new关键字改写,这用中文理解叫覆盖(子类中超类的同名方法还在只是不能直接用)
    二、超类的virtual方法,子类用override关键字改写,这用中文理解叫重写(子类中超类的同名方法被替换了)
    例:
    using System;
    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 OverrideTest
    {
    static void Main() {
    B b = new B();
    A a = b;
    a.F();
    b.F();
    a.G();
    b.G();
    }
    }
      

  3.   

    输出 Personnel
    因为 Officer类没有重写Personnel类的Accept方法
      

  4.   

    其实关键是在virtual里面的this到底是什么类型,而重写没有不是问题所在
    为什么会输出Personnel呢,证明Visit(Personnel p)传进给Visit的是一个Personnel类型的对象
    那么加一句 Console.WriteLine(this.GetType().ToString())在Accept里面,可以看到输出是Officer
    这不是证明在Accept里面this是Officer类型吗?怎么会调用Personnel类型参数的Visit呢?是不是在类里面不管是virtual还一般函数里面的this其实都是一个该类的类型呢?那么上述的this是Officer又何解?