サンプルコードで実際に追ってみる
下記のサンプルコードを動かして追ってみたいと思います。
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
順番としては下記のようになりました。
実際に動かしてみると実感がわきます。
親クラスのコンストラクタ
↓
子クラスのコンストラクタ
↓
子クラスのデストラクタ
↓
親クラスのデストラクタ
