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中文網其他相關文章!