継承におけるコンストラクタとデストラクタの呼び出し順序
http://www.geocities.jp/ky_webid/cpp/language/008.html
スーパークラス、およびサブクラスともにコンストラクタやデストラクタが存在していた場合、どのクラスのものが呼ばれるのでしょうか?
実際に動かしてみます。
#include <iostream> class CBase { public: CBase(); ~CBase(); }; class CSub : public CBase { public: CSub(); ~CSub(); }; CBase::CBase() { std::cout << "CBaseのコンストラクタ" << std::endl; } CBase::~CBase() { std::cout << "CBaseのデストラクタ" << std::endl; } CSub::CSub() { std::cout << "CSubのコンストラクタ" << std::endl; } CSub::~CSub() { std::cout << "CSubのデストラクタ" << std::endl; } int main () { CSub obj; return 0; }
$ main CBaseのコンストラクタ CSubのコンストラクタ CSubのデストラクタ CBaseのデストラクタ
コンストラクタの場合、スーパークラスからサブクラスへの順に呼ばれています。
変わってデストラクタの場合は、サブクラスからスーパークラスへの順で呼ばれています。
なるほど、確かに理にかなっていますね。
しかしこれ、サブクラス側でスーパークラスのコンストラクタを呼ばせない方法とかはあるんでしょうか?
そもそもそういうことをしたいような状態になること自体、設計がミスってるってことになるんですかね。その辺もうちょっと調べる必要がありそうです。