c++虚析構関数

4263 ワード

マルチステートを実装する場合、ベースクラスの構造関数はvirtualと書くべきです.インスタンス化されたサブクラスオブジェクトをベースクラスで宣言する場合、deleteの場合、ベースクラスが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修飾なしでは、サブクラス構造関数が呼び出されません.