C++类的析构函数调用和虚析构函数

析构函数一般是自动调用的,但是某些情况下页需要显式调用,如出栈和入栈操作:

void C::push_back(const X& a)
{
// ...
new(p) X{a}; // copy constr uct an X with the value a in address p
// ...
}

 

void C::pop_back()
{
// ...
p−>˜X(); // destroy the X in address p
}


也可以创建一个类,只能是显式调用析构函数,而不能隐式调用,如下:

class Nonlocal {
public:
// ...
void destroy() { this−>˜Nonlocal(); } // explicit destruction
private:
// ...
˜Nonlocal(); //don’t destroy implicitly
};
void user()
{
Nonlocal x; // error : cannot destroy a Nonlocal
X∗ p = new Nonlocal; // OK
// ...
delete p; // error : cannot destroy a Nonlocal
p.destroy(); //OK
}

这个时候,析构函数私有化了,不能被外部调用。只能调用公有函数destroy()

 

虚析构函数,就是在虚构函数前面增加virtual关键字,通常用在有其他虚函数的类中。

class Shape {
public:
// ...
virtual void draw() = 0;
virtual ˜Shape();
};
class Circle {
public:
// ...
void draw();
˜Circle(); // overrides ˜Shape()
// ...
};

虚析构函数的作用是当继承的时候,可以调用正确的析构函数正确地释放资源。

如下面Shape *p其实是可以想象为作为一群派生类的接口,当调用p->draw()的时候,就会调用适当的派生类如Circle, triangle等。

这个时候调用析构函数的时候也需要利用虚函数机制,才能调用适当的虚函数,释放适当的资源。

void user(Shape∗*p)
{
p−>draw(); // invoke the appropriate draw()
// ...
delete p; // invoke the appropriate destructor
};

某些书,如钱能的C++程序设计讲某些问题实在是讲的不好懂。讲的太绕了,无需深入去看。因为讲得并不好,也不实用。

其实就简单记得,所有基类的析构函数都记得定义为虚析构函数,前面加virtual。问题就解决了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值