在提供的程式碼片段中,我們在嘗試使用B *b = new 初始化B 類別的物件時觀察到錯誤B(5);,儘管基底類別A 中存在建構子。這提出了為什麼繼承的建構子在此不可存取的問題case.
理解這個問題的關鍵在於 C 中複雜的建構子繼承規則。在沒有明確建構子繼承的情況下,衍生類別不會自動從其基底類別繼承建構子。 C 03 標準就是這種情況。要實現建構子繼承,衍生類別必須明確使用using 關鍵字,如以下修正後的程式碼所示:
class A { public: explicit A(int x) {} }; class B: public A { using A::A; };
透過添加using A::A;,B 類別現在繼承了建構函數A 類,解決錯誤。需要注意的是,這種繼承適用於基底類別中的所有建構函數,而衍生類別不能選擇性地只繼承某些建構函數。
如果您的編譯器支援 C 11 標準,則可以使用建構子的 using 關鍵字遺產。然而,在 C 03 標準中,建構函式預設是不被繼承的,必須透過呼叫基底建構函式在衍生類別中手動實作。
對於模板化基底類,也可以使用 using 關鍵字繼承建構函數,如本範例所示:
template<class T> class my_vector : public vector<T> { public: using vector<T>::vector; ///Takes all vector's constructors /* */ };
以上是為什麼衍生類別不繼承 C 中的建構函式以及如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!