継承されたC++解析関数はvirtualを使用する必要があります

4307 ワード

まずvirtualを補うのは何ですか?
虚関数とは、クラス内で再ロードしたいメンバー関数を指し、ベースクラスポインタまたは参照で継承クラスオブジェクトを指すと、実際に継承クラスのバージョンを呼び出す虚関数を呼び出します. 
 
まずコードを貼ってから説明する
#include <iostream>

using namespace std;

class Base
{
public:
    Base(){cout<<"Base Construct"<<endl;};
    ~Base(){cout<<"Base destroy"<<endl;}
       
};

class A : public Base
{
public:
    A(){cout<<"A Construct"<<endl;}
    ~A(){cout<<"A destroy"<<endl;}
};
class Base1
{
public:
    Base1(){cout<<"Base1 Construct"<<endl;};
    virtual  ~Base1(){cout<<"Base1 destroy"<<endl;}
       
};

class A1 : public Base1
{
public:
    A1(){cout<<"A1 Construct"<<endl;}
    ~A1(){cout<<"A1 destroy"<<endl;}
};

int main()
{
    Base* p = new A;
    delete p;
    cout<<"======================"<<endl;
    Base1* p1 = new A1;
    delete p1;
    return 0;
}
/*
  Base Construct
  A Construct
  Base destroy
  ======================
  Base1 Construct
  A1 Construct
  A1 destroy
  Base1 destroy
*/

コードの末尾にあるコメントは出力です.
ベースの解析関数にはvirtualがありません
Base 1の解析関数にはvirtualがあります
 
Base* p = new A
delete p
このプロセスではBaseの構造関数のみが呼び出され,Aの構造関数は呼び出されない.
これにより、実際のアプリケーションでは不確定な結果が発生し、memory leakになる可能性があります.
Aの構造関数では、他のリソースを破棄する可能性がありますが、ここでは呼び出されていません.
したがって、Baseの構造関数にvirtual属性を与えます.