面试—每日一题(11)

没事干,写博客!记录自己的一些学习心得。一些小的细节部分,不经意间就被自己忽略了,但是到了真正用的时候,还真的想不起来怎么回事。我经常有这种感觉。

 

今天说说虚析构函数的用处:

这种面试题是经常出现的,请说说为什么要用虚析构函数。

在实际的编程中,有的时候,还真的不注意这个问题,但是,有的时候注意了,不知道为什么要注意这个问题。如果一个类不作为基类,就不需要使用任何虚函数,因为使用虚函数会增加程序的开销。但是,如果要作为虚函数,为维护完整性,就需要使用虚函数,让子类定义自己的具体行为。

所以基本的一条是,无故的声明虚析构函数和永远不去声明一样都是错误的。我们要知道什么时候声明和什么时候不声明;

对于虚析构函数,C++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。

 

析构函数定义为虚构函数有什么好处?

1.我们知道“析构函数”的作用就是释放资源;

2.而虚构函数能保证“总是执行实际对象的”那个函数

3.所以,我们把析构函数定义为虚函数总能保证对象释放时总是调用“对喜爱那个自己的函数”

4.析构函数定义为虚函数的好处就是能避免“资源泄露”,更安全。因此析构函数总是虚函数,因为这样总不会用错,否则,你就要处处小心;

代码示例演示:

#include <iostream>
using namespace std;

class A
{
public:
	A() {}
	~A() { cout<<"A destructor!\n"; }
};

class B:public A
{
public:
	B() {}
	~B() { cout<<"B destructor!\n"; }
};

int main()
{
	B *b = new B();
	A *a = b;

	delete a;
}


这个是没有虚析构函数的,测试一下~

#include <iostream>
using namespace std;

class A
{
public:
	A() {}
	virtual ~A() { cout<<"A destructor!\n"; }
};

class B:public A
{
public:
	B() {}
	~B() { cout<<"B destructor!\n"; }
};

int main()
{
	B *b = new B();
	A *a = b;

	delete a;
}


虚析构函数版本~~~

 

你可能感兴趣的:(编程,面试,测试,Class,语言,destructor)