繼承建構子:一個謎
當建構子沒有如預期繼承時,可能會令人費解。考慮以下程式碼片段:
class A<br>{<pre class="brush:php;toolbar:false">public: explicit A(int x) {}
};
class B: public A
{
} ;
int main(void)
{
B *b = new B(5); delete b;
}
此程式碼產生編譯錯誤:
main.cpp:13: error: no matching function for call to ‘B::B(int)’ main.cpp:8: note: candidates are: B::B() main.cpp:8: note: B::B(const B&)
意外地,類別B 沒有從A 類別繼承建構子。
揭曉解
在 C 03 中,建構子不會自動繼承。要繼承建構函數,需要從衍生類別建構函數手動呼叫它。然而,在 C 11 的建構子繼承中,這個限制得到了緩解。
利用建構子繼承
在 C 11 中,使用 using 關鍵字允許繼承基底類別中的所有建構子。為此,只需將以下行新增至衍生類別:
using A::A; // Inherits all constructors from class A
透過使用此技術,基底類別中的所有建構函式都會繼承到衍生類別中。
異常處理
需要注意的是,如果派生類別手動定義了構造函數,它不會從基類繼承任何構造函數。在這種情況下,必須手動定義所有建構函數,並根據需要明確呼叫基類構造函數。
模板化基類
對於模板化基類,類似的方法是受僱。若要將所有建構子從模板化基底類別繼承到衍生類別中,請使用下列語法:
using vector<T>::vector; /// Takes all vector's constructors
此方法可確保基底類別中的所有建構子都會繼承到衍生類別中。
以上是為什麼我的衍生類別不繼承我的基底類別的 C 建構子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!