派生類構造與析構函數

class A{
public:
    A(int var1):m_var1(var1){PrintOut();}
    virtual ~A() {PrintOut();};
    virtual void PrintOut(){printf("%d\n",m_var1) ;}
private:
    int m_var1 ;
} ;
class B: public A{
public:
    B(int var1,int var2):A(var1),m_var2(var2){PrintOut() ;}
    virtual ~B() {PrintOut() ;};
    virtual void PrintOut(){printf("%d\n",m_var2) ;} ;
private:
    int m_var2 ;
} ;
int main()
{
    cout<<"sizeof(A)="<<sizeof(A)<<endl ;
    cout<<"sizeof(B)="<<sizeof(B)<<endl ;
    A *ptmp = new B(1,2) ;
    ptmp->PrintOut() ;
    delete ptmp ;
}

上面一段代碼輸出結果:


派生類構造過程:先調用基類構造函數-》派生類構造函數

析構過程:先調用派生類析構函數-》基類析構函數

這裏有幾個問題:

1、基類的析構函數應該使用虛函數,這樣派生類在析構時纔會析構徹底,如果析構函數前面的virtual關鍵字去掉,這裏在析構時就只會調用基類的析構函數,從而導致內存泄露;

2、派生對象在析構時,先析構派生類對象,再析構基類對象,爲什麼基類析構輸出的基類的PrintOut函數,而不是派生類的PrintOut函數?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章