首頁 >後端開發 >C++ >方法繼承中的'新”和'覆蓋”關鍵字有什麼區別?

方法繼承中的'新”和'覆蓋”關鍵字有什麼區別?

DDD
DDD原創
2025-01-28 11:56:09241瀏覽

What's the Difference Between `new` and `override` Keywords in Method Inheritance?

深入理解“new”和“override”關鍵字

面向對象編程中,繼承是核心概念,允許派生類擴展和修改基類的行為。在定義這些類的方法時,開發者可能需要重寫或創建新的實現。為了闡明這種區別,讓我們考察以下場景:

場景一:基類

<code class="language-c#">public virtual void DoIt();</code>

此語法在基類中聲明了一個虛方法。虛方法可以在派生類中被重寫以提供具體的實現。

場景一:派生類

<code class="language-c#">public new void DoIt();</code>

在派生類方法中使用“new”會創建一個新的、獨立的方法,其名稱與基類中的方法相同。但是,這不被認為是重寫,並且當從基類引用調用時,不會影響基類方法的行為。

場景二:基類

<code class="language-c#">public void DoIt();</code>

這是一個非虛方法,不能在派生類中被重寫。派生類必須使用“new”修飾符實現一個具有相同名稱的新方法。

場景二:派生類

<code class="language-c#">public override void DoIt();</code>

“override”修飾符表示派生類中的方法正在重寫基類中具有相同簽名的另一個方法。當通過基類引用調用時,將執行重寫的方法。

實際區別

  • Override: 無論引用類型如何,只要調用該方法,派生類中的重寫方法就會被調用。
  • New: 只有當引用派生類對象時,派生類中新創建的方法才會被調用。

推薦用法

通常,當擴展繼承方法的行為時,建議使用“override”。如果要在派生類中創建具有相同名稱的新方法,請使用“new”。

示例

考慮以下代碼:

<code class="language-c#">public class Base
{
    public virtual void DoIt()
    {
        Console.WriteLine("Base.DoIt");
    }
}

public class Derived : Base
{
    public override void DoIt()
    {
        Console.WriteLine("Derived.DoIt");
    }
}

Base b = new Derived();
b.DoIt();                      // 调用 Derived.DoIt</code>

在此示例中,“Derived.DoIt()”重寫了“Base.DoIt()”,並且當從引用“Derived”對象的“b”變量調用“DoIt()”方法時,會調用它。

以上是方法繼承中的'新”和'覆蓋”關鍵字有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn