C++ 考虑虚函数(virtual 函数)以外的其他选择

20180323 C++ 考虑虚函数(virtual 函数)以外的其他选择



在一个视频游戏的软件中,需要为游戏中的人物设计一个继承体系。游戏是个动作战斗游戏,每个人物都有个数值表示它的健康状况,所以需要设计一个成员函数heathValue,它会返回一个整数(如0~100),表示任务的健康程度,因为不同的人物可以有不同的方式计算他们的健康指数(如主人公是0~100,而妖怪的0.00~999.99),所以需将heathValue声明为虚函数(virtual):
class GameCharacter{
public:
  virtual int heathValue() const;//返回人物的健康指数
                                 //派生类(derived classes)可重新定义它
  ...
};


heathValue并未声明为纯虚的(pure virtual),这暗示我们将会有个计算健康指数的缺省算法。


其他一些替代方案如下:


一、 借由非虚接口(Non-Virtual Interface)手法实现模板方法(Template Method)模式
有一类人主张,虚(virtual)函数应该几乎总是私有(private)的,即保留heathValue为公有(public)成员函数,但让他成为非虚(non-virtual)的,并调用一个私有虚(private virtual)函数(比如doHeathValue)进行实际工作:
class GameCharacter{
public:
  int healthValue() const  //派生类不重新定义它
  {
    ...                    //做一些事前工作
    int retVal = dohealthValue();//做真正的工作
    ...                    //做一些事后工作
    return retVal;
  }
  ...
private:
  virtual int doHealthValue() const   //派生类可重新定义它
  {
    ...     //缺省算法,计算健康指数
  }  
  
}




这一基本设计,就是“让客户通过公有非虚的(public non-virtual)成员函数间接调用私有虚函数(private virtual函数)”,称为non-virtual interface(NVI)手法,它是所谓模板方法(Template Method)设计模式(与C++ 的模板(templates)并无关联)的一个独特表现形式。这个非虚的函数(non-virtual)函数(healthValue)又称为虚(virtual)函数的外覆器(wrapper)。
NVI的一个优点是可以“做一些事前工作”和“做一些事后工作”,“事前工作”可以包括锁定互斥器(locking a mutex)、制造运转日志记录项(log entry)、验证class约束条件、验证函数先决条件等,“事后工作”可以包括互斥器解除锁定(unlocking a mutex)、验证函数的事后条件、再次验证class约束条件等。若让用户直接调用虚(virtual)函数,就没有任何好办法可以做这些事。




当在程序中要求虚函数(virtual)必须是保护的(protected)或公有的(public),就不能实施NVI手法了。








二、借由函数指针(Function Pointers)实现策略(Strategy)模式


/************************剩下的 没看懂*************************/




























































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值