派生类不调用基类方法

本文关键字:基类 类方法 调用 派生 | 更新日期: 2023-09-27 18:15:56

class MyBaseClass
{
  virtual public void Print()
    {
      Console.WriteLine("This is the base class.");
    }
}
class MyDerivedClass : MyBaseClass
{
  override public void Print()
   {
     Console.WriteLine("This is the derived class.");
   }
 }
class Program
  {
    static void Main()
    {
      MyDerivedClass derived = new MyDerivedClass();
      MyBaseClass mybc = (MyBaseClass)derived;
      derived.Print();
      mybc.Print();
    }
   }
输出:

This is the derived class.
This is the derived class.

我不明白为什么第二个调用打印派生类的print()方法,因为我将mybc对象强制转换为基类。我希望它打印基类打印方法。我遗漏了什么吗?

派生类不调用基类方法

变量类型和实例类型是两种不同的类型。强制类型转换不会改变实例类型。

当你声明一个方法是虚/抽象的,你是在说你想要在调用时确定行为的实例类型。

还要注意,这个赋值是有效的——不需要将变量类型从子类更改为基类。这种类型的强制转换可以隐式地完成。

MyBaseClass mybc = derived;

您已经覆盖了它。它只调用派生方法。你必须显式地调用基类的方法:

override public void Print() {
     base.Print();
     Console.WriteLine("This is the derived class.");
}

重写虚方法的要点在于调用对象的底层(运行时)类型的版本,而不是静态(编译时)类型的版本——即使通过声明为基类的类型调用它也是如此。

这就像它应该做的那样

如果不是这种情况,它将使类层次结构的许多实用程序无用,因为您不能通过向方法传递自定义派生类来改变传递给它的类类型的行为。