构造函数和析构函数

本文探讨了MFC类库中CObject类的析构函数为何设为虚函数的原因,解析了虚函数的工作原理及代价,并解释了构造函数不能为虚函数的原因。

1.MFC类库中,CObject类的析构函数是虚拟的,为什么MFC的编写者认为virtual destructors are necessary?

例子:

class CBase

{

public:

~CBase(){....};

};

class CChild : public CBase

{

public:

~CChild(){...};

};

main()

{

CBase *pBase;

CChild c;

pBase = &c;

....return 0;

}

解:在这个例子里,所有对象都存在于堆栈中,当离开其所处的作用域时,该对象会被自动撤销,看是没有什么问题。但是试想,如果CChild类的构造函数在堆中分配内存,而其析构函数又不是virtual型的,那么撤销pBase时,将不会调用CChild:~CChid(),从而不会释放CChild:CChid()占据的内存,造成内存泄漏。

将CObject类的析构函数是为virtual型的,则所有CObject类的派生类的析构函数都将会自动变为virtual型,这保证了在任何情况下,不会出现由于析构函数未被调用而导致的内存泄露。

2.析构函数可以为virtual型,构造函数则不能。为什么构造函数不能为虚的?

解:虚函数采用一种虚调用的办法。虚调用是一种可以在之有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚。

3.如果虚函数是有效的,是否可以把每一个函数都声明为虚函数?

解:不行,这是因为虚函数是有代价的:由于每一个虚函数的对象都必须维护一个V表,因此在使用虚函数的时候都会产生一个系统开销。如果仅是一个很小的类,且不想派生其他类,那么就根本没有必要使用虚函数。

转载于:https://www.cnblogs.com/Rookie-h/archive/2012/10/15/2725034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值