2013-12-11 23 views
2

由于亲本三/子类,像这样:重写方法在多层次的继承

class A { 
    public virtual void doSomething() { 
     //do things 
    } 
} 

class B : A { 
    public override /*virtual?*/ void doSomething() { 
     //do things 
     base.doSomething(); 
    } 
} 

class C : B { 
    public override void doSomething() { 
     //do things 
     base.doSomething(); 
    } 
} 

如果类BdoSomething()方法有其签名都overridevirtual,因为它也被覆盖C类,或者应该只有类A在其doSomething()方法签名中有virtual

+2

你试过这个代码吗? Visual Studio抱怨说“覆盖方法不能被标记为虚拟”。 –

+0

这很奇怪。它根本不抱怨我。 –

+0

如果你在'B'中取消注释'/ * virtual * /',它会不会抱怨? –

回答

6

如果某个方法已经在其中一个超类中标记为虚拟,则不需要(读取:您不能)将方法标记为虚拟方法。

该方法在整个继承树中保持虚拟状态,直到子类将其标记为sealed。密封的方法不能被任何子类覆盖。

4

MSDN

您不能使用静态,或虚拟修饰符 修改重写方法。

此外,

重写的基础方法必须是虚拟抽象,或倍率

这意味着你可以可以覆盖已被标记为覆盖的方法。