Derived class 不调用 base class 方法

Derived class does not call base class method

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.

我不明白为什么第二次调用打印派生的 class 的 print() 方法,因为我将 mybc 对象转换为基础 class。我希望它改为打印 base class 打印方法。我在这里遗漏了什么吗?

重写虚方法的全部意义在于调用对象的底层(运行时)类型的版本,而不是静态(编译时)类型的版本——即使您通过声明为基础的类型 class.

所以这完全符合预期。

如果不是这种情况,class 层次结构的许多实用程序将变得无用,因为您无法更改传递给方法的 class 类型的行为通过传递给它一个自定义派生 class.

你已经覆盖了它。它只调用派生方法。您必须明确 call the base class' method:

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

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

当您将方法声明为 virtual/abstract 时,您是在说您想要 调用时确定行为的实例类型。

另请注意,此赋值是有效的 - 无需转换语法即可将变量类型从子类更改为基类。这种转换可以隐式完成。

MyBaseClass mybc = derived;