継承されたC++解析関数はvirtualを使用する必要があります
4307 ワード
まずvirtualを補うのは何ですか?
虚関数とは、クラス内で再ロードしたいメンバー関数を指し、ベースクラスポインタまたは参照で継承クラスオブジェクトを指すと、実際に継承クラスのバージョンを呼び出す虚関数を呼び出します.
まずコードを貼ってから説明する
コードの末尾にあるコメントは出力です.
ベースの解析関数にはvirtualがありません
Base 1の解析関数にはvirtualがあります
Base* p = new A
delete p
このプロセスではBaseの構造関数のみが呼び出され,Aの構造関数は呼び出されない.
これにより、実際のアプリケーションでは不確定な結果が発生し、memory leakになる可能性があります.
Aの構造関数では、他のリソースを破棄する可能性がありますが、ここでは呼び出されていません.
したがって、Baseの構造関数に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属性を与えます.