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