Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 継承におけるコンストラクターとデストラクター | イントロダクション
C++ OOP原則

book継承におけるコンストラクターとデストラクター

メニューを表示するにはスワイプしてください

基底クラスのコンストラクタが最初に呼ばれる

継承の文脈において、コンストラクタは派生クラスを正しく初期化する上で重要な役割を果たす。コンストラクタが呼び出される順序を理解することは、継承の仕組みを把握するための鍵となる。以下のコードスニペットの出力を確認し、コンストラクタ呼び出しの順序を見てみよう。

main.cpp

main.cpp

copy
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; }
Note
注意

基底クラスのコンストラクタによる初期化が完了した後、派生クラスのコンストラクタが実行される。

スーパークラスは最初に呼び出されます。これは、サブクラスが継承したメンバーを初期化する必要があるためです。これにより、サブクラスは有効な状態で開始し、基底クラスの初期化済みの状態に依存できるようになります。

main.cpp

main.cpp

copy
123456789101112131415161718
class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }

例では、初期化リストでパラメータ付きのコンストラクタを呼び出しています。サブクラスのコンストラクタの初期化リスト内で、スーパークラスのコンストラクタを明示的に呼び出す必要があります。初期化リストで基底クラスのコンストラクタを指定しない場合、スーパークラスデフォルトコンストラクタが自動的に呼び出されます。

派生クラスのデストラクタが最初に呼ばれる

オブジェクトが破棄される際、デストラクタはコンストラクタの逆順で呼び出されます。つまり、最も派生したクラスのデストラクタが最初に呼ばれ、その後、宣言順とは逆に各基底クラスのデストラクタが呼ばれます。

main.cpp

main.cpp

copy
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; }
Note
注意

派生クラスのデストラクタによるクリーンアップが完了した後に、基底クラスのデストラクタが呼び出されます。

question mark

派生クラスのオブジェクトを生成および破棄する際の、コンストラクタとデストラクタの正しい呼び出し順序はどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  10

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  10
some-alt