「継承とコンストラクタとデストラクタ」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> __TOC__ == 概要 == クラス継承した場合、コンストラクタデストラクタは、どのよう...」)
 
(相違点なし)

2013年3月24日 (日) 02:05時点における最新版


概要

クラス継承した場合、コンストラクタデストラクタは、どのような順番で呼び出されるのでしょうか?

コンストラクタデストラクタの呼び出しは、以下の順番になります。

  1. 親クラスのコンストラクタ
  2. 子クラスのコンストラクタ
  3. インスタンスの主な処理
  4. 子クラスのデストラクタ
  5. 親クラスのデストラクタ

継承した場合のコンストラクタとデストラクタの実行の順番の例

ソースコード 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()

クラス継承によるデストラクタにおける問題

クラスを継承したときに、デストラクタにおいて問題になるケースがあります。 詳しくは、継承と仮想デストラクタをご参照ください。

関連項目