以下のコードで、CBaseのデストラクタを、仮想デストラクタにすることで、アップキャストした場合でも、派生クラス(CSub, CSub1)のデストラクタが呼ばれます。
しかし、CSubのデストラクタは、仮想デストラクタではないため、CSub1のデストラクタが呼ばれるのは、不思議に感じます。
規格上、正しい動作なのでしょうか。
コンパイラ: Visual C++ 2015
以下のリンク先の質問で、インターフェースクラスがこの様な実装になっています。
読まなくても問題はないと思いますが、関連した質問としてリンク先を載せます。
インターフェースクラスを仮想継承して実装する理由
C++
1#include <iostream> 2 3class CBase { 4public: 5 virtual ~CBase() { 6 std::cout << "~CBase" << std::endl; 7 } 8}; 9 10class CSub : public CBase { 11public: 12 ~CSub() { 13 std::cout << "~CSub" << std::endl; 14 } 15}; 16 17class CSub1 : public CSub { 18public: 19 ~CSub1() { 20 std::cout << "~CSub1" << std::endl; 21 } 22}; 23 24int main() { 25 CBase* base = new CSub(); 26 delete base; 27 std::cout << std::endl; 28 29 CBase* base1 = new CSub1(); 30 delete base1; 31 std::cout << std::endl; 32 33 CSub* sub = new CSub1(); 34 delete sub; 35}
実行結果 ~CSub ~CBase ~CSub1 ~CSub ~CBase ~CSub1 ~CSub ~CBase
また以下は、CBaseのデストラクタを、非仮想デストラクタにして実行した結果です。
最初と2番目の結果は理解できるのですが、最後の結果が理解できません。
なぜ、CBaseのデストラクタが呼ばれるのでしょうか。
実行結果 ~CBase ~CBase ~CSub ~CBase
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/08 13:55