在物件導向程式設計中,繼承允許類別繼承其基底類別的屬性和方法。這項強大的功能可實現程式碼重用和可維護性。然而,處理繼承類別中的建構函數和賦值運算子可能具有挑戰性。
考慮一個具有一組建構子和一個賦值運算子的類別 B。目標是建立一個繼承類別 D,它重寫 foo() 但保留 B 的建構子和賦值運算子。
實現此目的的一種方法是明確調用構造函數和賦值運算符這涉及到在創建D 實例時手動調用適當的基類構造函數,並使用Base::operator=() 在賦值運算子中賦值。
<code class="cpp">class Base { // ... public: Base(const Base&) { /*...*/ } Base& operator=(const Base&) { /*...*/ } }; class Derived : public Base { int additional_; public: Derived(const Derived& d) : Base(d) // dispatch to base copy constructor , additional_(d.additional_) { } Derived& operator=(const Derived& d) { Base::operator=(d); additional_ = d.additional_; return *this; } };</code>
有趣的是,即使沒有明確定義建構函數和賦值運算符,編譯器也可以自動產生它們。對於具有直接繼承和最少自訂的類別來說就是這種情況。
<code class="cpp">class ImplicitBase { int value_; // No operator=() defined }; class Derived : public ImplicitBase { const char* name_; public: Derived& operator=(const Derived& d) { ImplicitBase::operator=(d); // Call compiler generated operator= name_ = strdup(d.name_); return *this; } }; </code>
因此,當從提供一組全面的構造函數和賦值運算符的基類繼承時,可以在派生類無需重寫它們,只要這些函數中不需要附加功能即可。
以上是如何在 C 的衍生類別中使用基底類別建構子和賦值運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!