如何在C 中利用基底類別的建構子和賦值運算子
在C 中,繼承類別可以繼承基底類別的行為,包括建構函數和賦值運算子。考慮一個帶有一組建構子和一個賦值運算子的基底類別B:
<code class="cpp">class B { public: B(); B(const string& s); B(const B& b) { *this = b; } B& operator=(const B& b); };</code>
現在,您想要建立一個衍生類別D,它重寫foo() 函數,同時繼承同一組構造函數,包括複製建構函數和賦值運算子。但是,為了避免重複,您希望使用 B 中現有的建構函式和運算子。
明確呼叫:
您可以明確地呼叫基底類別的建構子和賦值運算子分別在衍生類別的建構子和賦值運算子中。這確保了基類的成員變數被正確初始化。
<code class="cpp">class D : public B { public: D(const D& d) : B(d), additional_(d.additional_) {} D& operator=(const D& d) { B::operator=(d); additional_ = d.additional_; return *this; } private: int additional_; };</code>
隱式呼叫:
有趣的是,即使您沒有明確定義複製構造函數並且派生類別中的賦值運算符,編譯器將產生預設版本。這些預設版本分別隱式呼叫基底類別的複製建構函式和賦值運算子。
例如,對於以下基類:
<code class="cpp">class ImplicitBase { int value_; };</code>
以下派生類別的賦值運算子隱式呼叫基類的賦值運算子:
<code class="cpp">class Derived : public ImplicitBase { const char* name_; public: Derived& operator=(const Derived& d) { ImplicitBase::operator=(d); // Implicit call to base class's assignment operator name_ = strdup(d.name_); return *this; } };</code>
以上是如何在 C 中利用基底類別的建構子和賦值運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!