簡體   English   中英

初始化基類成員的首選方法(c ++)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM