构造函数和析构函数

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

posted @ 2012-10-15 21:20  Rookie_h  阅读(299)  评论(0编辑  收藏  举报