簡體   English   中英

派生類不調用基類方法

[英]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();

    }
   }

OUTPUT:

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

我不明白為什么第二次調用打印派生類的print()方法,因為我將mybc對象轉換為基類。 我希望它能打印基類打印方法。 我在這里錯過了什么嗎?

變量類型和實例類型是兩種不同的類型。 轉換不會更改實例類型。

當您聲明一個方法是虛擬/抽象時,您說您希望實例類型在被調用時確定行為。

另請注意,此賦值有效 - 不需要使用強制轉換語法將變量類型從子類更改為baseclass。 這種演員表可以隱含地完成。

MyBaseClass mybc = derived;

你已經覆蓋了它。 它只調用派生方法。 您必須顯式調用基類的方法

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

覆蓋虛方法的重點是調用對象的底層(運行時)類型的版本,而不是靜態(編譯時)類型的版本 - 即使通過聲明為基類的類型調用它也是如此類。

所以這完全符合它的行為。

如果不是這種情況,則會使類層次結構的很多實用程序變得無用,因為您無法通過將類傳遞給自定義的派生類來更改傳遞給方法的類類型的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM