现在的位置: 首页 > 综合 > 正文

派生类构造与析构函数

2018年03月16日 ⁄ 综合 ⁄ 共 658字 ⁄ 字号 评论关闭
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函数?

抱歉!评论已关闭.