在物件導向程式設計中,一個常見的任務是在衍生類別的建構子中初始化基底類別的成員變數。但是,某些情況可能會阻止此初始化。讓我們探討一個這樣的場景和推薦的解決方案。
考慮以下程式碼片段:
class A { public: int a, b; }; class B : public A { B() : A(), a(0), b(0) { } };
這裡,程式嘗試初始化基底類別 A 的成員變數 a 和 b衍生類別 B 的建構子。但是,這種方法會失敗並出現編譯錯誤。
這個錯誤的原因在於 a 和 b 不是成員B 的成員,它們是基底類 A 的成員。因此,只有 A 的建構子才有權初始化它們。
與其直接在衍生類別建構函式中初始化 a 和 b,更有效的解決方案是將它們宣告為基底類別中的受保護成員,並利用基底類別中的建構函式進行初始化。這種方法允許派生類別透過繼承來存取和初始化這些變數。
這是一個修改後的程式碼片段,示範了這個改進的方法:
class A { protected: A(int a, int b) : a(a), b(b) {} // Accessible to derived classes // Change "protected" to "public" to allow others to instantiate A. private: int a, b; // Keep these variables private in A }; class B : public A { public: B() : A(0, 0) // Calls A's constructor, initializing a and b in A to 0. { } };
在此修改後的程式碼中,基底類別的建構函式類別A 採用兩個整數參數並相應地初始化成員變數a 和b。衍生類別 B 繼承 A 的 protected 建構函數,並在自己的建構子中呼叫它,以預設值 0 初始化 a 和 b。
這種方法確保成員變數的正確初始化,同時保持封裝性並遵守物件導向程式設計原理。
以上是如何從衍生類別建構函數正確初始化基底類別成員變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!