なぜ継承関係のあるクラス構造では、構造関数destructorがvirtualでなければ何が起こるのかについて

2371 ワード

#include <iostream>
 using namespace std;
 
 class Base
 {
 public:
     Base(){cout<<"Base constructor"<<endl;}
     ~Base(){cout<<"Base dectructor"<<endl;}
 };
 
 class Derived : public Base
 {
 public:
     Derived(){cout<<"Derived constructor"<<endl;}
     ~Derived(){cout<<"Derived destructor"<<endl;}
 };
 
 int main()
 {
     Base * p = new Derived();
     delete p;
     return 1;
 }
 

 
出力結果は次のとおりです.
Base constructor
Derived constructor
Base dectructor
 

 
明らかに使用されています
Base * p = new Derived();

ベースクラスポインタがサブクラスオブジェクトを生成する場合、サブクラスオブジェクトの構造関数を自動的に呼び出すことができます.
でも
delete p;

の場合、pはベースクラスポインタであり、サブクラスの構造関数が呼び出されないとメモリ漏洩が発生することを観察した.