0

可能な重複:

C ++スーパークラスコンストラクター呼び出し規則

どのようにして作業をスーパークラスのコンストラクタに委任しますか?例えば

class Super {
public:
    int x, y;
    Super() {x = y = 100;}
};
class Sub : public Super {
public:
    float z;
    Sub() {z = 2.5;}
};

どうやって入手できますかSub::Sub()電話するSuper::Super()設定する必要はありませんのでxそしてy両方のコンストラクタで?


  • を見てみましょうこの質問一般的なスーパー/サブクラスのエチケットのために。 - WhozCraig

2 답변


5

コンストラクタのメンバ初期化子リストを使う:

class Super {
public:
    int x, y;
    Super() : x(100), y(100)  // initialize x and y to 100
    {
       // that was assignment, not initialization
       // x = y = 100;
    }
};
class Sub : public Super {
public:
    float z;
    Sub() : z(2.5) { }
};

基本クラスを明示的に呼び出す必要はありません。デフォルトコンストラクタ、派生クラスのコンストラクタが実行される前に自動的に呼び出されます。

一方、ベースクラスをパラメータで構築したい場合(そのようなコンストラクタが存在する場合)、必要それを呼び出すには:

class Super {
public:
    int x, y;
    explicit Super(int i) : x(i), y(i)  // initialize x and y to i
    { }
};
class Sub : public Super {
public:
    float z;
    Sub() : Super(100), z(2.5) { }
};

さらに、任意のコンストラクタ呼ぶことができる引数なしの場合もデフォルトのコンストラクタです。だからあなたはこれを行うことができます:

class Super {
public:
    int x, y;
    explicit Super(int i = 100) : x(i), y(i)
    { }
};
class Sub : public Super {
public:
    float z;
    Sub() : Super(42), z(2.5) { }
};
class AnotherSub : public {
public:
    AnotherSub() { }
    // this constructor could be even left out completely, the compiler generated
    // one will do the right thing
};

また、ベースメンバーをデフォルト値で初期化したくない場合にのみ明示的に呼び出してください。

お役に立てば幸いです。


1

でベースコンストラクタを呼び出すmember initialize list必要に応じて、実際にはSuper()コンストラクタが自動的に呼び出されます。

スーパーデストラクタを仮想にするのを忘れないでください。

class Super {
public:
    int x, y;
    Super() : x(100),y(100) {}
    virtual ~Super(){}
};

スーパーへのポインタを介した削除を許可する必要がある場合、スーパーデストラクタはパブリックかつ仮想である必要があります。


  • Super()コンストラクターは自動的に呼び出されます(明示的に呼び出す必要はありません)。スーパークラスのデストラクタを多相基底型にする場合にのみ、仮想クラスをデストラクタにします(仮想メンバがないため、必ずしもそうとは限りません)。 - Martin York
  • あなたに注意してくださいする必要はありませんこの場合、コンパイラーによって暗黙的に呼び出されるため、基本コンストラクターを呼び出します。明示的にリストするだけですデフォルト以外コンストラクタ(引数を渡すため)ロキもまた、デストラクタを常に多態性にしたくないという点では正しいです。 - David Rodríguez - dribeas
  • 前に空白を追加してください: Super()… - Potatoswatter
  • これではなく、もう一方を支持してください。 - billz

リンクされた質問


関連する質問

最近の質問