c++虚析構関数
4263 ワード
マルチステートを実装する場合、ベースクラスの構造関数はvirtualと書くべきです.インスタンス化されたサブクラスオブジェクトをベースクラスで宣言する場合、deleteの場合、ベースクラスがvirtualの構造関数でなければ、サブクラスに入る構造関数を呼び出すことはできません.
virtual修飾なしでは、サブクラス構造関数が呼び出されません.
class Base{
public:
Base();
virtual ~Base();
public:
char *m_pName;
};
Base::Base(){
cout<<"Base()"<<endl;
m_pName = new char[1024];
memset(m_pName, 0, 1024);
}
Base::~Base(){
cout<<"~Base()"<<endl;
if (m_pName) {
delete [] m_pName;
m_pName = NULL;
}
}
class Child:public Base{
public:
Child();
~Child();
public:
char *m_pAge;
};
Child::Child(){
cout<<"Child()"<<endl;
m_pAge = new char[2048];
memset(m_pAge, 0, 2048);
}
Child::~Child(){
cout<<"~Child()"<<endl;
if (m_pAge) {
delete [] m_pAge;
m_pAge = NULL;
}
}
int main(){
Base *pBase = new Child();
delete pBase;
}
:
Base()
Child()
~Base()
, 。
, virtual.
class Base{
public:
Base();
virtual ~Base();
public:
char *m_pName;
};
:
Base()
Child()
~Child()
~Base()
virtual修飾なしでは、サブクラス構造関数が呼び出されません.