2017-11-12 3 views
1

したがって、親クラスのコンストラクタを呼び出す通常の方法は、初期化リストにあります:C++は、初期化リストの外で親コンストラクタを明示的に呼び出します

#include <cstdio> 

struct Parent { 
    explicit Parent(int a) { 
    printf("Parent -- int\n"); 
    } 
}; 

struct Child : public Parent { 
    explicit Child(int a) : Parent(1) { 
    printf("Child -- int\n"); 
    } 
}; 

int main(int argc, char **argv) { 
    Child c = Child(10); 
}; 

プリントParent -- intその後、Child -- int

(どちらかというと)それは良い考えであるかどうかにかかわらず、初期化リストの外で(構築されているオブジェクト上の)コンストラクタの本体で親コンストラクタを明示的に呼び出すことができるかどうかは疑問です。

+0

私は迷惑なことを言うだろうし、なぜあなたはこれをやりたいのですか? –

+0

@NirFriedman私はしたくないし、行っていない。私は可能かどうか疑問に思います*。 C++のコンストラクタは、私が使用した他の言語(例えば、継承されない、無意味なコンストラクタが暗黙的に呼び出される、明示的に...など)と比較して、奇妙な動作をします。私は言語の境界についてより良い感じを得ようとしています。 –

+0

"*親クラスのコンストラクタを呼び出す通常の方法は初期化リストにあります*" - これは単に普通の方法ではなく、それだけです。 –

答えて

1

いいえ、あなたのやり方ではないので、オブジェクトの親部分を構築します。

このような状況に対処するための一般的な方法は、「初期化」を持っているか、あなたは子供のコンストラクタから呼び出すことができます方法を「構築」することです:

struct Parent { 
    explicit Parent(int a) { 
     Construct(a); 
    } 
protected: 
    void Construct(int a) { printf("Parent -- int\n"); } 
    Parent() {} 
}; 

struct Child : public Parent { 
    explicit Child(int a) { 
     Parent::Construct(a); 
     printf("Child -- int\n"); 
    } 
}; 

int main(int argc, char **argv) { 
    Child c = Child(10); 
}; 
0

あなたはです。でも同じことはしません。

explicit Child(int) { 
    Parent(1); 
} 

オブジェクトのParent部分を初期化しません。代わりに、タイプParentの新しい一時オブジェクトが作成され、その一時オブジェクトがただちに破棄されます。

+0

申し訳ありませんが、私はより明確にすべきでした。私は、構築されているオブジェクトの上に親コンストラクタを呼び出すことを意味しました。 –

+0

おそらくhttps://stackoverflow.com/questions/308276/can-i-call-a-constructor-from-another-constructor-do-constructor-chaining-in-c? – JustMe

関連する問題