C++ 之virtual析构函数

1.析构函数

class A

{

public:

A();

~A();   //析构函数

}

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

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

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

class Base

{

public:

Base();

virtual ~Base();

//...

}

class Derived: public Base

{

public:

Derived();

~Derived();

//...

}

当有如下调用时:

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

delete base ;

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

4.析构函数的virtual使用不正确时

例如

class Point

{

public :

Point(int x,int y);

~Point();

private:

int x,y;

}

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

含有virtual的函数其对象的体积会增加,因为它多了一个vptr指针,所以C++的Point对象就不能和其他语言有着一样的声明结构了,因为也不再具有可移植性。

 

综上所述,所以当定义析构函数为虚函数时需要知道当前类是否还有子类,如果没有子类,则可以将其析构函数不定义为虚函数,否则则定义为虚函数。

 

 

 

 

posted @ 2019-11-30 15:42  肃肃  阅读(2128)  评论(0编辑  收藏  举报