可能な重複:
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
両方のコンストラクタで?
コンストラクタのメンバ初期化子リストを使う:
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
};
また、ベースメンバーをデフォルト値で初期化したくない場合にのみ明示的に呼び出してください。
お役に立てば幸いです。
でベースコンストラクタを呼び出すmember initialize list
必要に応じて、実際にはSuper()コンストラクタが自動的に呼び出されます。
スーパーデストラクタを仮想にするのを忘れないでください。
class Super {
public:
int x, y;
Super() : x(100),y(100) {}
virtual ~Super(){}
};
スーパーへのポインタを介した削除を許可する必要がある場合、スーパーデストラクタはパブリックかつ仮想である必要があります。
: Super()
… - Potatoswatter