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对象就不能和其他语言有着一样的声明结构了,因为也不再具有可移植性。
综上所述,所以当定义析构函数为虚函数时需要知道当前类是否还有子类,如果没有子类,则可以将其析构函数不定义为虚函数,否则则定义为虚函数。