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对象就不能和其他语⾔有着⼀样的声明结构了,因为也不再具有可移植性。
综上所述,所以当定义析构函数为虚函数时需要知道当前类是否还有⼦类,如果没有⼦类,则可以将其析构函数不定义为虚函数,否则则定义为虚函数。
析构函数的定义
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论