2012-10-08 62 views
4

有沒有辦法強制派生類使用抽象基類的構造函數?它不一定是一個真正的構造者,我對開創性的解決方案持開放態度。強制派生類使用基類的構造函數

class Abstract 
{ 
private: 
    int Member; 
    string Text; 

public: 
    Abstract(int Member, string Text) 
    { 
     this->Member = Member; 
     this->Text = Text; 
    } 

    // e.g. defining virtual functions 
} 

例如我的抽象類有一些私人成員,每個派生類也應該有。而且它們應該在構造函數中定義,甚至違背派生類的意願。

我知道構造函數沒有被繼承。但是有沒有一種解決方法來產生類似的行爲?

+3

未定義默認構造函數的派生類來使用任何其他構造函數。 – PiotrNycz

+2

目前尚不清楚問題是什麼。任何從'Abstract'派生的類都必須使用'Abstract'中的唯一構造函數。 –

+0

只是不要創建任何你不想做的構造函數。由於派生類實例是基類的實例,因此必須調用構造函數。沒有什麼特別的你需要做。 –

回答

7

使用派生類的構造函數的初始化列表。

class Base 
{ 
    Base(int Member, string Text) { //... 
    } 
}; 

class Derived : public Base 
{ 
    Derived(int Member, string Text) : Base(Member, Text) { 
            // ^^^^^^^^^^^^^^^^^^ 
     // ... 
    } 
}; 
+3

這是一個有效的評論,但我不認爲它回答OP的問題。 –

+0

這個方法已經出現在我的腦海裏,但這不是我正在尋找的。因爲派生類不必*必須使用初始化列表。此外,它會混淆五個或更多的參數。 – danijar

+2

@KonradRudolph問題是「*是否有辦法強制派生類使用抽象基類的構造函數?」這肯定會強制使用基類構造函數。 –

8

正如其他用戶所建議的那樣,您必須將基類構造函數調入派生類構造函數的初始值設定項列表中。

但還有另一個很酷的解決方案bringed上升C++ 11:inherited constructors

class Base 
{ 
    Base(int Member, string Text) { }; 
}; 

class Derived : public Base 
{ 
    using Base::Base; // <-- Brings to derived the Base's constructor. 
}; 

但是你必須保證你的編譯器可以使用C++ 11層的功能;當然,研究繼承的構造函數是否符合你的要求,而不是僅僅因爲它是使用它而是使用它cool

+0

非常感謝你的加入! – danijar

相關問題