スポンサーリンク

サンプルコードで実際に追ってみる

下記のサンプルコードを動かして追ってみたいと思います。

SuperクラスとSub01クラスを定義しています。
SuperクラスとSub01クラスは親子関係にあります。

それぞれコンストラクタとデストラクタを定義しています。
ただし、デストラクタはvirtualデストラクタにしています。

実行時には、子クラスのsub01クラスのオブジェクトをnewで生成し、その後deleteします。

 $ cat sample.cpp 
#include <iostream>

class Super{
	public:
		void outHello(){
			std::cout << "hello top" << std::endl;
		}
		Super(){
			std::cout << "Call constructor:Super class" << std::endl;
		}
		virtual ~Super(){
			std::cout << "Call destructor:Super class" << std::endl;
		}
};

class Sub01: public Super{
	public:
		void outHello(){
			std::cout << "hello Sub01" << std::endl;
		}
		Sub01(){
			std::cout << "Call constructor:Sub01 class" << std::endl;
		}
		~Sub01(){
			std::cout << "Call destructor:Sub01 class" << std::endl;
		}
};

int main(){	
	Super* pSub01 = new Sub01();

	pSub01->outHello();

	delete pSub01;
}

スポンサーリンク

実行結果:呼び出し順

下記が実行結果になります。

 $ g++ -o sample sample.cpp
 $ ./sample 
Call constructor:Super class
Call constructor:Sub01 class
hello top
Call destructor:Sub01 class
Call destructor:Super class

順番としては下記のようになりました。
実際に動かしてみると実感がわきます。

親クラスのコンストラクタ

子クラスのコンストラクタ

子クラスのデストラクタ

親クラスのデストラクタ

スポンサーリンク