使用子類別的初始化清單初始化受保護的父類成員
在物件導向程式設計中,您可能需要初始化在父類中聲明的受保護成員來自子類別的建構子。這是一個常見的場景,但問題出現了:可以使用子類別的初始化列表來實現嗎?
讓我們考慮以下範例:
<code class="cpp">class Parent { protected: std::string something; }; class Child : public Parent { private: Child() : something("Hello, World!") {} };</code>
當嘗試編譯此程式碼時,編譯器會報告錯誤:「類別『Child』沒有任何名為『something』的欄位」。這個錯誤表示編譯器無法在Child類別中找到something成員。
這裡的問題在於子類別的初始化清單(:something("Hello, World!"))無法存取protected父類別的成員。這是因為初始化清單初始化了子類別本身的私有成員,而父類別的受保護成員無法從子類別的私有部分存取。
解決方案:轉發建構子
要解決這個問題,您可以在父類別中使用轉送建構函式將初始化值傳遞給受保護的成員:
<code class="cpp">class Parent { protected: Parent(const std::string& something) : something(something) {} std::string something; }; class Child : public Parent { private: Child() : Parent("Hello, World!") {} };</code>
透過這個方法,子類別的建構子呼叫父類別的建構子透過Parent("Hello, World!") 語法。此初始化將 Something 參數傳遞給父類別的建構函數,然後初始化受保護的 Something 成員。
以上是可以使用子初始化清單來初始化受保護的父成員嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!