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)当定义析构函数为虚函数时需要知道当前类是否还有子类,如果没有子类,则可以将其析构函数不定义为虚函数,否则则定义为虚函数。

你可能感兴趣的:(面向对象,c++,开发语言)