簡體   English   中英

C ++:將構造函數放在繼承鏈中的什么位置?

[英]C++: where to place constructor in inheritance chain?

我有以下困境:

我有一個完整的抽象類。 每個繼承類都需要3個相同的參數。 他們每個人還需要其他特定參數。

我可以:

1)實現一個通用構造函數,用於在基類中初始化3個通用參數,但是隨后我必須為對應的字段(它們是私有的)創建非抽象的getter。

要么

2)將我的基類保留為抽象,並在繼承的類中實現構造函數,但隨后我必須在每個類字段中將其用作通用參數。

哪種方法更好? 我不想使用受保護的成員。

抽象類是至少具有一個純虛函數(或您所說的抽象)的類。 只要具有至少一個純虛函數,具有非抽象非虛函數就不會改變您的類是抽象的事實。 在基類中具有通用功能,即使它是抽象的。

如果您的類看起來像這樣,則是一個純抽象類:

class IFoo {
   public:
    virtual void doThings() = 0;
}

class Foo {
   public:
      Foo(std::string str);
     void doThings() override;
}

繼承的價值在於為您提供在運行時將Foo替換為Foo的機會,但將具體實現隱藏在接口后面。 您不能將其與構造函數一起使用,就沒有像虛擬構造函數這樣的東西(這就是為什么存在諸如Abstract Factory Pattern之類的東西)的原因。 您所有的Foo實現都采用std::string而您所有的doThings實現doThings使用該字符串? 很好,但這不是巧合,不是合同,不屬於IFoo

讓我們談談您是否已經在IFoo創建了具體的實現,因此它是一個抽象類而不是一個純粹的抽象類( IFoo現在是一個壞名字,順便說一句)。 (* 1)讓我們假設使用繼承來共享行為是您課堂上的正確選擇,有時是正確的。 如果類具有需要初始化的字段,則創建一個protected構造函數(從每個子實現中調用),然后刪除/省略默認構造函數。

class BaseFoo {
       private:
         std::string _fooo;
       protected:
         BaseFoo(std::string fooo) : _fooo(fooo) {}
       public:
         virtual void doThings() = 0;
         std::string whatsTheBaseString() { return _fooo;}
   }

上面是從子構造函數正確傳遞基類所需字段的方式。 這是一個編譯時保證,子類將“記住”正確初始化_fooo ,並且避免將實際成員fooo暴露給子類。 直接在所有子構造函數中嘗試初始化_fooo是錯誤的。

* 1)很快,為什么? 撰寫可能是這里更好的工具?

避免代碼重復而又不污染數據成員抽象接口的一種方法是引入額外的繼承級別:

// Only pure virtual functions here
class Interface {
public:
    virtual void foo() = 0;
};

// Things shared between implementations
class AbstractBase : public Interface {

};

class ImplementationA : public AbstractBase {
};

class ImplementationB : public AbstractBase {
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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