Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8434
  • 博文数量: 6
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-28 15:22
文章分类
文章存档

2009年(6)

我的朋友
最近访客

分类:

2009-04-02 16:04:04

代理类、句柄与虚函数

关于代理类我的理解是代理类充分利用了虚函数的一大特点:使用一个基类指针来指向一个派生类对象,那么虚函数和非虚函数的区别就体现出来。

calss Base{
public:
  void f();
  virtual void g();
};

class Derived : public Base{
public:
  void f();
  virtural void g();
};  

现在可以创建Base类和Derived类的对象, 还可以获得指向他们的指针:

Base b;
Derived d;

Base *bp = &b;
Base *bpd = &d;
Derived *dp = &d;

用这些指针分别调用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不是所有类都是为了继承而设计的。

另一方面,还有一种必须使用虚函数的情况。当想删除一个表面上指向基类对象、实际却是指向派生类对象的指针,就需要虚析构函数。

更为常见的是,写程序时我们必须考虑自己正在做什么。仅仅根据规则和习惯思维行事是不够的。

阅读(401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~