親の仮想関数をoverrideした場合、下記のソースコードのChild::Print()
内のParent::Print()
のような感じでoverrideした子の関数から明示的に呼び出されない限りは親の関数は呼び出されないと思っていました。
しかし、下記のソースコードを実行してみると、親の仮想デストラクタをoverrideした子のインスタンスの破棄時に親のデストラクタが呼び出されていました。
仮想デストラクタのみ特別な仕様となっているのでしょうか?
ソースコード
cpp
1#include <iostream> 2 3using namespace std; 4 5class Parent { 6 7public: 8 virtual ~Parent(){ 9 cout << "Parent ::~Parent()" << endl; 10 } 11 12 virtual void Print() { 13 cout << "Parent ::Print()" << endl; 14 } 15}; 16 17class Child : public Parent { 18public: 19 virtual ~Child() override { 20 cout << "Child::~Child()" << endl; 21 } 22 23 virtual void Print() override { 24 cout << "Child::Print()" << endl; 25 26 Parent::Print(); 27 } 28}; 29 30int main() { 31 Child child; 32 child.Print(); 33 cout << endl; 34 35 return 0; 36}
実行結果
Child::Print() Parent ::Print() Child::~Child() Parent ::~Parent()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/24 14:38