没有“ virtual”关键字的C#中的多级继承

slo*_*ams 0 c# oop

我是C#的新手,只是一个关于多级继承的问题假设我们有以下类:

Class Employee
{
   public virtual void CalculateBonus() {
      ...
   }
}

class SalesPerson : Employee 
{
    public override void CalculateBonus() {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

假设我们还有另一个派生自SalesPerson的类

class PTSalesPerson : SalesPerson
{
   public override void CalculateBonus() {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题很简单,基类中的virtual关键字需要被其子类覆盖。应用相同的逻辑,virtual关键字也应在SalesPerson类中应用如下:

class SalesPerson : Employee 
{
   public virtual override void CalculateBonus() {
     ... //compiler error
   }
}
Run Code Online (Sandbox Code Playgroud)

这样PTSalesPerson可以覆盖其父方法。这是否意味着“虚拟”关键字只需要出现在1级基类中?还是覆盖=覆盖+虚拟?

AAA*_*ddd 7

您不能将覆盖的方法标记virtual为已经定义为虚拟的

虚拟的(C#参考)

备注

调用虚拟方法时,将检查对象的运行时类型是否有重写成员。如果没有派生类重写该成员,则将调用最派生类中的重写成员,该成员可能是原始成员。

默认情况下,方法是非虚拟的。您不能覆盖非虚拟方法。

您不能将虚拟修饰符与静态,抽象,私有或替代修饰符一起使用。


如果这样做,则会出现令人讨厌的编译时错误

编译器错误CS0113

标记为替代的成员“功能”不能标记为新成员或虚拟成员

用new和override关键字标记方法是互斥的。


要回答的基本关注,您标记的最低水平需要被被覆盖的virtual,任何派生类,则可以override