「継承とコンストラクタとデストラクタ」の版間の差分
提供: C++入門
(相違点なし)
|
2013年3月24日 (日) 02:05時点における最新版
目次
概要
クラスを継承した場合、コンストラクタとデストラクタは、どのような順番で呼び出されるのでしょうか?
コンストラクタとデストラクタの呼び出しは、以下の順番になります。
- 親クラスのコンストラクタ
- 子クラスのコンストラクタ
- インスタンスの主な処理
- 子クラスのデストラクタ
- 親クラスのデストラクタ
継承した場合のコンストラクタとデストラクタの実行の順番の例
ソースコード extends_destructor_1.cpp
#include <iostream> using namespace std; class B { public: B() { cout << __PRETTY_FUNCTION__ << endl; } ~B() { cout << __PRETTY_FUNCTION__ << endl; } void x() { cout << __PRETTY_FUNCTION__ << endl; } void f() { cout << __PRETTY_FUNCTION__ << endl; } }; class C1 : public B { public: C1() { cout << __PRETTY_FUNCTION__ << endl; } ~C1() { cout << __PRETTY_FUNCTION__ << endl; } void f() { cout << __PRETTY_FUNCTION__ << endl; } }; int main(int argc, char const* argv[]) { C1 c1; c1.x(); c1.f(); return 0; }
コンパイル
g++ extends_destructor_1.cpp -o extends_destructor_1
実行例
% ./extends_destructor_1 B::B() C1::C1() void B::x() void C1::f() C1::~C1() B::~B()
クラス継承によるデストラクタにおける問題
クラスを継承したときに、デストラクタにおいて問題になるケースがあります。 詳しくは、継承と仮想デストラクタをご参照ください。