分类:
2009-04-02 16:04:04
代理类、句柄与虚函数
关于代理类我的理解是代理类充分利用了虚函数的一大特点:使用一个基类指针来指向一个派生类对象,那么虚函数和非虚函数的区别就体现出来。
|
现在可以创建Base类和Derived类的对象, 还可以获得指向他们的指针:
|
用这些指针分别调用f(), g()时可以看到:
bp->f(); /*Base::f()*/ bp->g(); /*Base::g()*/
bdp->f();/*Base::f()*/ bdp->g();/*Derived::g()*/
dp->f(); /*Derived::f()*/ dp->g(); /*Derived::g()*/
因此代理类实际是需要包含虚函数的基类的,而使用代理类的目的也正是为了在C++容器中包含类型不同但相互关联的对象。
句柄用于在保持代理多态行为的同时,避免不必要的复制。最简单的句柄就是添加一个引用计数,将句柄类对象绑定到他所控制的对象上。
什么时候不应当使用虚函数?
首先我们注意到, 如果只关注程序的行为,同时没有继承关系,那么函数是否为虚函数根本无关紧要。因此只有当涉及到继承时, 才有必要考虑一些问题。在使用到继承的程序中,也不需要所有的函数都设为虚函数, 因为:1虚函数的代价并不是十分高昂,但也不是免费的午餐,在使用它们之前,要认真考虑其开销,这一点十分重要;2有些情况下非虚函数能够正确运行,而虚函数却不行;3不是所有类都是为了继承而设计的。
另一方面,还有一种必须使用虚函数的情况。当想删除一个表面上指向基类对象、实际却是指向派生类对象的指针,就需要虚析构函数。
更为常见的是,写程序时我们必须考虑自己正在做什么。仅仅根据规则和习惯思维行事是不够的。