虚析构函数的作用是什么
虚析构函数的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明。
说明虚析构函数的目的在于在使用delete运算符删除一个对象时,能保析构函数被正确地执行。因为设置虚析构函数后,可以采用动态联编方式选择析构函数。
下面举一个用虚析构函数的例子。
#include
class A
{
public:
virtual ~A() { cout < < "A::~A() Called.\n "; }
};
class B : public A
{
public:
B(int i) { buf = new char[i]; }
virtual ~B()
{
delete [] buf;
cout < < "B::~B() Called.\n ";
}
private:
char * buf;
};
void fun(A *a)
{
delete a;
}
void main()
{
A *a = new B(15);
fun(a);
}
执行该程序输出如下结果:
B::~B() Called.
A::~A() Called.
如果类A中的析构函数不用虚函数,则输出结果如下:
A::~A() Called.
当说明基类的析构函数是虚函数时,调用fun(a)函数,执行下述语句:
delete a;
由于执行delete语句时自动调用析构函数,采用动态联编,调用它基类的析构函数,所以输出上述结果。
当不说明基类的析构函数为虚函数时,delete隐含着对析构函数的调用,故产生
A::~A() Called.
的结果。
class A { public: virtual ~A() { cout << "A::~A() Called.\n "; } }; class B : public A { public: B(int i) { buf = new char[i]; } ~B() { delete [] buf; cout <<"B::~B() Called.\n "; } private: char * buf; }; class C:public B{public: C(int i):B(i){}//派生类向基类传值 ~C() { cout<<"C::~C() called\n"; }};
只要基类声明了虚析构函数,则它所有的派生类均不用再将析构函数声明为虚的
思考下下面两段代码的输出:
代码1:
B *a = new C(7);
delete a;
代码2:
A *a = new C(7);
delete a;
两段代码均输出:
C::~C() called
B::~B() Called.
A::~A() Called.
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。