首頁 >後端開發 >C++ >為什麼我的衍生類別不繼承我的基底類別的 C 建構子?

為什麼我的衍生類別不繼承我的基底類別的 C 建構子?

Barbara Streisand
Barbara Streisand原創
2024-12-21 07:35:10519瀏覽

Why Doesn't My Derived Class Inherit My Base Class's Constructor in C  ?

繼承建構子:一個謎

當建構子沒有如預期繼承時,可能會令人費解。考慮以下程式碼片段:

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

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