C++ 中关于virtual析构函数

1.析构函数

class Model

{

public:

Model();

~Model(); //析构函数

}

2.析构函数需要声明为virtual条件:

当定义的类中含有除去析构函数外的其他函数为virtual函数时,这时需要将此类的析构函数定义为virtual函数;

3.virtual析构函数好处:当父类指针指向子类对象时,执行释放操作,子类对象也会被释放掉

class Base

{

public:

Base();

virtual ~Base();

//…

}

class subModel: public Base

{

public:

subModel();

~subModel();

//…

}

当有如下调用时:

Base *base =new subModel(); //父类的一个指针实际向子类对象

delete base ;

将Base析构函数声明为virtual函数时,执行delete base ;语句就会删除subModel的对象;

  1. 下面类没有vtbl

例如

class Point

{

public :

Point(int x,int y);

~Point();

private:

int x,y;

}

需要实现出virtual函数时,对象就必须携带某些信息来决定在运行期调用哪一个virtual函数,通常是由vptr(virtual table point)指针决定的,它指向一个由函数指针构成的数组,称为vtbl(virtual table);每一个class都有一个对应的vtbl。当对象调用某一virtual函数时,实际被调用的函数取决于该对象的vptr所指的那个vtbl。
含有virtual的函数其对象的体积会增加,因为它多了一个vptr指针。

总结:
1)尽量将析构函数定义为virtual。
2)当定义析构函数为虚函数时需要知道当前类是否还有子类,如果没有子类,则可以将其析构函数不定义为虚函数,否则则定义为虚函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值