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