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函數?