継承におけるコンストラクターとデストラクター
メニューを表示するにはスワイプしてください
基底クラスのコンストラクタが最初に呼ばれる
継承の文脈において、コンストラクタは派生クラスを正しく初期化する上で重要な役割を果たす。コンストラクタが呼び出される順序を理解することは、継承の仕組みを把握するための鍵となる。以下のコードスニペットの出力を確認し、コンストラクタ呼び出しの順序を見てみよう。
main.cpp
12345678910111213141516#include <iostream> class Base { public: Base() { std::cout << "Base constructor called" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor called" << std::endl; } }; int main() { Derived derivedObj; }
注意
基底クラスのコンストラクタによる初期化が完了した後、派生クラスのコンストラクタが実行される。
スーパークラスは最初に呼び出されます。これは、サブクラスが継承したメンバーを初期化する必要があるためです。これにより、サブクラスは有効な状態で開始し、基底クラスの初期化済みの状態に依存できるようになります。
main.cpp
123456789101112131415161718class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
例では、初期化リストでパラメータ付きのコンストラクタを呼び出しています。サブクラスのコンストラクタの初期化リスト内で、スーパークラスのコンストラクタを明示的に呼び出す必要があります。初期化リストで基底クラスのコンストラクタを指定しない場合、スーパークラスのデフォルトコンストラクタが自動的に呼び出されます。
派生クラスのデストラクタが最初に呼ばれる
オブジェクトが破棄される際、デストラクタはコンストラクタの逆順で呼び出されます。つまり、最も派生したクラスのデストラクタが最初に呼ばれ、その後、宣言順とは逆に各基底クラスのデストラクタが呼ばれます。
main.cpp
12345678910111213141516#include <iostream> class Base { public: ~Base() { std::cout << "Base destructor called" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor called" << std::endl; } }; int main() { Derived derivedObj; }
注意
派生クラスのデストラクタによるクリーンアップが完了した後に、基底クラスのデストラクタが呼び出されます。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 1. 章 10
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 1. 章 10