条款35:考虑virtual函数以外的其他选择

假设你现在的需求是实现一个返回伤害值的功能。
由于不同的人物可能会以不同的方式计算他们的伤害值
所以这可以使用virtual来定义它,子类可以进行重新定义。

class GameCharacter
{public:GameCharacter(int x):x(x){}virtual int AttackValue() const;private:protected:int x;
};

但这样的设计从某种角度来说却是漏洞百出。由于设计的如此明显,你可能因此没有考虑其他解法。

让我来介绍下面其他解法。

由Non-Virtual Interface 手法实现 Template Method

给予外部一个AttackValue()方法,
返回值为内部的Virtual doAttackValue()
这样让客户间接调用重写函数 doAttackValue()


#include <iostream>
using namespace std;
class GameCharacter
{public:GameCharacter(int x):x(x){}int AttackValue() const{return doAttackValue();}private:virtual int doAttackValue()const{cout << "GameCharacter  ";return x;}protected:int x;
};
class Player:public GameCharacter
{public:Player(int x):GameCharacter(x){}private:virtual int doAttackValue()const{cout << "Player  " ;return x * x;}
};
class Enemy :public GameCharacter
{public:Enemy(int x) :GameCharacter(x){}
private:virtual int doAttackValue()const{cout << "Enemy  " ;return x * x * x;}
};int main()
{int x = 10;GameCharacter gameCharacter(x);Player player(x);Enemy enemy(x);cout << gameCharacter.AttackValue()<<endl;cout << player.AttackValue() << endl;cout << enemy.AttackValue() << endl;
}

运行结果:

藉由Function Pointers 实现Strategy模式

由函数指针实现策略模式。我们要求每个人物构造函数接收一个指针,指向一个攻击力计算函数。
这样攻击力计算函数不再是类继承体系的成员函数。

#include <iostream>
using namespace std;
class GameCharacter;//前置声明
//计算攻击力的缺省算法
int defaultAttackCalc(const GameCharacter& gc);typedef int (*AttackCaleFunc)(const GameCharacter&);
class GameCharacter
{public:GameCharacter(int x,AttackCaleFunc hcf=defaultAttackCalc):x(x),attackFunc(hcf){}int AttackValue() const{return attackFunc(*this);}int x;private:AttackCaleFunc attackFunc;};
class Player:public GameCharacter
{public:Player(int x,AttackCaleFunc hcf=defaultAttackCalc):GameCharacter(x,hcf){}
};
class Enemy :public GameCharacter
{public:Enemy(int x,AttackCaleFunc hcf = defaultAttackCalc) :GameCharacter(x, hcf){}
private:
};
int defaultAttackCalc(const GameCharacter& gc)
{cout << "default ";return gc.x;
}
int PlayerAttackCalc(const GameCharacter& gc)
{cout << "player ";return gc.x* gc.x;
}
int EnemyAttackCale(const GameCharacter& gc)
{cout << "Enemy ";return gc.x * gc.x * gc.x;
}
int main()
{int x = 10;GameCharacter gameCharacter(x);Player player(x,PlayerAttackCalc);Enemy enemy(x,EnemyAttackCale);cout << gameCharacter.AttackValue()<<endl;cout << player.AttackValue() << endl;cout << enemy.AttackValue() << endl;
}

运行结果:

藉由tr1:function 实现Strategy模式

由于我没用过c++11 所以我就不献丑了

用virtual实现TemplateMethod和Strategy--龙之介《Effective C++》实验室相关推荐

  1. 计算机网络应用层--龙之介计算机网络学习(2)

    概述: 其实计算机网络主要聊的就是因特网五层协议栈的那几种协议,通过对各个协议的构成,了解一个数据包(报文)是如何从网络中完成传输的作用. 这是一个系列的,主要用于自己复习计网. 协议分层概念–龙之介 ...

  2. 计算机网络传输层UDP协议--龙之介计算机网络学习(3)

    概述: 其实计算机网络主要聊的就是因特网五层协议栈的那几种协议,通过对各个协议的构成,了解一个数据包(报文)是如何从网络中完成传输的作用. 这是一个系列的,主要用于自己复习计网. 计算机网络应用层–龙 ...

  3. 字典树Trim详解+相关例题---龙之介算法基础课

    字典树,顾名思义,是关于"字典"的一棵树. 即:它是对于字典的一种存储方式(所以是一种数据结构而不是算法). 这个词典中的每个"单词"就是从根节点出发一直到某一 ...

  4. 构造/析构/赋值运算--龙之介《Effective C++》实验室

    条款5:了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符 但是c++拒绝编译那一行赋值动作.你不会自动co ...

  5. 协议分层概念--龙之介计算机网络学习(1)

    概述: 其实计算机网络主要聊的就是因特网五层协议栈的那几种协议,通过对各个协议的构成,了解一个数据包(报文)是如何从网络中完成传输的作用. 协议分层 类比人类登机航班流程: 利用分层体系,使得各个功能 ...

  6. 智能指针实战讲解--龙之介《Effective C++》实验室

    条款13 以对象管理资源 在C++中 我们申请资源(new) 之后需要手动释放资源(delete) Test* t = new Test();//申请资源......delete t;//释放资源 但 ...

  7. 多源BFS 理解学习+代码模板---跟龙之介学算法

    单源BFS是广搜,基于队列的思想,找到初始结点入队,然后把邻接点入队,直到搜索完. 而多源BFS就是,可以多个源点入队,然后每次都将当前入队的所有结点的邻边入队.这次我们核心围绕多源BFS分几种体型来 ...

  8. template类的typename详解--龙之介《Effective C++》实验室

    条款typename的双重定义 声明关键字class和typename可互换 假设你这样声明一个迭代器 C::const_iterator iter(container.begin()); 这将不是一 ...

  9. Strategy模式的具体实现

    看了下,Strategy模式,很是安慰,觉得该模式不用脑子去记了,因为这个模式跟Bridge模式好像是一样的,至少这两个在接收指针对象上的区别我没怎么看出来,但是跟 Template模式相比,我觉得吧 ...

最新文章

  1. hadoop无法访问50070端口怎么办?
  2. AI处理器热潮正在消退
  3. magic number
  4. Python基础概念_8_字符串处理
  5. python中僵尸进程
  6. php 接口日志,PHP 开发 APP 接口--错误日志接口
  7. linux5.5 里dns,RedHat 5.5搭建各种DNS服务器(3)
  8. java createcriteria_Hibernate createCriteria查询详解
  9. 是什么门的缩写_干货分享:汽车排气系统部件有什么?出故障都有什么现象?...
  10. 计划任务文件 linux,Linux计划任务Crontab学习笔记(3):配置文件
  11. Csico CCNA学习笔记1_cdp telnet
  12. Ubuntu12.04中如何让命令行路径变短
  13. matlab求函数方程的正根,matlab解方程组的时候,可以只要正根吗?
  14. Hibernate三大类查询总结
  15. 基于TCP的STM32 IAP bootloader初步设计
  16. Android软键盘适配问题
  17. 【宝藏系列】如何解决word选中文字按backspace无法删除的问题
  18. iReport导出Excel文件一个字段要占用多列问题的解决
  19. MES系统报价这么高,企业为什么还要选择它?
  20. TI C2000介绍

热门文章

  1. 剥茧抽丝做 UI 动效,其实很简单
  2. 【环境配置】cudnn无注册下载+无法下载问题
  3. linux系统安装触摸驱动程序,fc8下怎么安装触摸屏驱动程序?
  4. asp.net aspxgridview 绑定数据
  5. 【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
  6. win10自带输入法在切换中英文的过程中,出现了输入字符所占间距变大的问题
  7. 如何基于无代码平台实现60个园区、3万台设备的管理?
  8. Spring 事务隔离
  9. 2020 Android 大厂面试-插件化、模块化、组件化,移动开发工程师的岗位职责
  10. 自制遥控小车,遥控距离可达2000米? (nrf24l01射频模块+Arduino nano+L297N)