首頁 >後端開發 >C++ >為什麼派生類別中的重載方法需要明確方法呼叫?

為什麼派生類別中的重載方法需要明確方法呼叫?

DDD
DDD原創
2024-11-02 12:50:021058瀏覽

Why is Explicit Method Invocation Required for Overloaded Methods in Derived Classes?

C 重載解析:需要明確方法選擇

在C 中,重載解析根據參數類型和方法所在的範圍進行被宣布。為了確保準確的方法選擇,某些場景需要明確的方法呼叫。

考慮以下範例:

<code class="cpp">class A {
  public:
    int DoSomething() { return 0; }
};

class B : public A {
  public:
    int DoSomething(int x) { return 1; }
};

int main() {
  B* b = new B();
  b->A::DoSomething(); // Why this?
  // b->DoSomething(); // Why not this? (Compiler error)
  delete b;
  return 0;
}</code>

為什麼語句是 b->A::DoSomething();有必要嗎?

了解重載解析:

在這種情況下,編譯器在執行重載解析時會考慮方法的範圍。預設情況下,它僅在目前類別的範圍內搜尋方法匹配。在類別 B 中,編譯器在目前範圍內找到 DoSomething(int),它接受單一 int 參數。

需要明確呼叫:

但是,父類A 也聲明了一個不含參數的 DoSomething() 版本。要在衍生類別 B 中存取此方法,必須使用類別作用域運算子 (A::) 明確呼叫它。

語句 b->DoSomething();將無法編譯,因為編譯器無法在類別 B 的範圍內找到名為 DoSomething() 的不含參數的方法。它錯誤地認為 DoSomething(int) 是預期的方法。

解決方案:

為了解決這個問題,一種解決方案是在類 B 中引入 using 聲明。這會將DoSomething() 方法從父類別拉入衍生類別的範圍:

<code class="cpp">class B : public A {
public:
    using A::DoSomething;
    // …
};</code>

透過此修改,重載解析現在可以正確識別所需的DoSomething() 方法,從而無需使用b- >A::DoSomething(); 進行明確呼叫。

以上是為什麼派生類別中的重載方法需要明確方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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