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