5

派生クラスに抽象基本クラスのコンストラクターを使用させる方法はありますか?それは本当のコンストラクターであってはなりません、私は創造的な解決策についてオープンマインドを持っています。

class Abstract
{
private:
    int Member;
    string Text;

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

    // e.g. defining virtual functions
}

たとえば、私の抽象クラスには、すべての派生クラスにも必要なプライベートメンバーがいくつかあります。また、派生クラスの意志に反する場合でも、コンストラクターで定義する必要があります。

コンストラクターは継承されないことを知っています。しかし、同様の動作を生成するための回避策はありますか?

4

2 に答える 2

18

他のユーザーが提案しているように、派生クラスコンストラクターの初期化子リストに基本クラスコンストラクターを呼び出す必要があります。

しかし、C ++ 11によってもたらされた別のクールなソリューションがあります:継承されたコンストラクター

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

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

ただし、コンパイラがC++11機能を使用できることを確認する必要があります。そしてもちろん、継承されたコンストラクターが、かっこいいという理由だけで使用するのではなく、要件に準拠しているかどうかを調べてください。

于 2012-10-08T14:35:20.893 に答える
9

派生クラスのコンストラクターの初期化子リストを使用します。

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

class Derived : public Base
{
    Derived(int Member, string Text) : Base(Member, Text) {
                                    // ^^^^^^^^^^^^^^^^^^
        // ...
    }
};
于 2012-10-08T14:23:37.477 に答える