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表,因此在使用虚函数的时候都会产生一个系统开销。如果仅是一个很小的类,且不想派生其他类,那么就根本没有必要使用虚函数。