构造函数与析构函数以及virtual

构造函数一定不可以为虚函数。

A->B      //A为基类,派生了B

A的析构函数为~A();

B的析构函数为~B();

现在定义了一个B对象。

若A的析构函数不为virtual,则B析构时,调用的是基类A的析构函数~A(),尽管B显式定义了自己的析构函数~B()。

若A的析构函数为virtual,则B析构时,先调用B的析构函数~B(),再调用基类A的析构函数~A()。

 

其他非构造与析构的函数,都可以声明为virtual。但若在类的构造与析构函数中调用这些虚函数,是不会呈现出多态的。

比如:

class A
{
       A();
       virtual ~A(){clear();}     
       virtual void clear();
}

class B : public A
{
       B();
       virtual ~B(){clear();}
       virtual void clear();
}

main()
{
       Bb;
       A*pA = (A*)(&b);
       deleatepA;
}

上面的代码,将B的对象b赋给基类A的指针pA,然后删掉pA。由于析构函数前有virtual关键字,这样会先调用B的析构函数再调用A的析构函数。

但是,由于是用A的指针来进行析构,当调用virtual~B(){clear ();}时,析构函数中又调用了一个虚函数clear(),那么到底是调用A的clear()还是B的clear()呢?

在构造函数与析构函数中,调用的一切其他virtual函数都失去多态性。

所以,调用virtual ~B(){clear ();}时,会直接调用B的clear()。然后调用virtual ~A(){clear ();}时,并且在其中会直接调用A的clear()。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值