C++虚析构函数使用场景

1、什么是虚函数和多态

虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,也就是运行时多态,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。

编译器对每个包含虚函数的类创建一个表(称为V TA B L E)。在V TA B L E中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为v p o i n t e r(缩写为V P T R),指向这个对象的V TA B L E。通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个V P T R,并在V TA B L E表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。为每个类设置V TA B L E、初始化V P T R、为虚函数调用插入代码,所有这些都是自动发生的,所以我们不必担心这些。利用虚函数,这个对象的合适的函数就能被调用,哪怕在编译器还不知道这个对象的特定类型的情况下。(《C++编程思想》)

多态指同一个方法根据其所属的不同对象可以有不同的行为,即一个接口,多种实现。


2、为什么需要使用虚析构函数?

我们先来看一个例子,如下代码你认为最后的输出会是什么呢?

class A
{
public:
	~A()
	{
		cout<<"Destruct class A"<<endl;
	}
};
class B :	public A
{
public:
	~B()
	{
		cout<<"Destruct class B"<<endl;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	A*	a	=	new	B;
	delete a;
	return 0;
}
输出为

Destruct class A
而只要你在A类的析构函数前加上virtual使其成为一个虚析构函数,那么输出就将是
Destruct class B
<pre name="code" class="cpp">Destruct class A

 

一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏,如上面所说,如果基类析构函数不是虚析构函数的话,将造成只释放了基类部分,而没有释放子类部分,早成内存泄漏。


3、什么情况下使用虚析构函数?

当你在程序中使用一个基类的指针指向子类对象的时候,那么你得注意了,此时你的基类析构函数必须为虚析构,在你delete基类指针时,才会先进入子类的析构函数释放资源,再进入基类析构函数释放资源,达到完全释放的效果。
    当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类,并且指向子类对象的时候,才把析构函数写成虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值