[英]Preferred way to initialize base class members (c++)
我有一個基類:
class Base {
protected:
int m_a;
virtual void foo() = 0;
}
和派生類
class Derived : public Base {
public:
Derived(int a);
}
基類是抽象的,因此只能創建派生類。 如何實現派生的Ctor更好的方法?
Derived::Derived(int a) : Base(a) {}
Base::Base(int a) : m_a(a) {}
要么
Derived::Derived(int a) { m_a = a;}
Base::Base(){}
從Base構造函數中刪除成員是否更好,因為它不能單獨創建,或者將它保留在Base構造函數上以便為他保留賦值?
您的第一個解決方案 - 為基類提供顯式構造函數 - 最好作為一般模式:
它避免了從Base繼承的其他類忘記初始化m_a。 相反,類的簽名表示需要初始化。
如果多個類繼承自base,並且初始化更復雜(例如范圍檢查),則此代碼和策略不會分布在多個派生類上
如果m_a是不可變的,則需要構造函數初始化
派生類可能有多個CTor,更多的地方要忘記
唯一的缺點:更多的打字 - 只要你不計算額外的“我今天有點懶,所以不要忘記在所有派生類構造函數中初始化m_a”
“簽名宣布要求”是IMO足以使其成為默認模式,因此“另一種方式需要使m_a受到保護”,如評論中所述。
我會比較喜歡 :
Derived::Derived(int a) : Base(a) {}
Base::Base(int a) : m_a(a) {}
通過這種方式,您可以使代碼更加封裝, Base
成員會關注其初始化列表,基類構造函數中可能會有更多的init邏輯,這取決於m_a,而不僅僅是初始化m_a
。 在這種情況下,您將初始值傳遞給基礎構造函數,然后在其構造函數中派生類已初始化基類的構造函數。
您應該嘗試將init值傳遞給Base
類,假設您有5個Derived
類,並且需要在所有派生的ctors中初始化基類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.