码迷,mamicode.com
首页 > 其他好文 > 详细

除寻函数外的其他多态方法

时间:2020-06-11 21:38:34      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:pre   virtual   character   int   接收   func   virt   span   方法   

关键点一:将虚函数定义为private然后用一个非虚函数来包装它

 1 class GameCharacter{
 2 public:
 3     int healthValue()const{
 4         ...
 5         int retVal = doHealthValue();
 6         ...
 7         return retVal;
 8     }
 9 private:
10     virtual int doHealthValue() const{
11         ...
12     }
13 }

以上形式不同的任务的派生类可以继承GameCharacter基类,重写自己的private的费血虚函数,在调用非虚函数的过程中会因为多台而动态绑定。

 

关键点二:以指针的形式来实现多态

 1 class GameCharater;
 2 int defaultHealthCalc(const GameCharacter& gc);
 3 class GameCharacter{
 4 public:
 5     typedef int(*HealthCalcFunc)(const GameCharacter&);
 6     explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
 7         :healthFunc(hcf)
 8     {}
 9     int healthValue() const
10     {
11         return healthFunc(*this);
12     }
13     ...
14 private:
15     HealthCalcFunc healthFunc;
16 };
17 
18 class EvilBadGuy :public GameCharacter{
19 public:
20     explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc)
21         :GameCharacter(hcf){
22         ...
23     }
24     ...
25 };
26 int loseHealthQ(const GameCharacter&);
27 int loseHealthS(const GameCharacter&);
28 
29 EvilBadGuy ebg1(loseHealthQ);
30 EvilBadGuy ebg2(loseHealthQ);

以上代码,每个类型的任务都去继承GameCharater类,这个类的特点是他能够接收一个指针然后控制血量。

这样做相比于将掉血函数设置为类的成员函数有以下特点:

1.每个对象都可以拥有自己的掉血函数。

2.掉血函数在运行期可变。

除寻函数外的其他多态方法

标签:pre   virtual   character   int   接收   func   virt   span   方法   

原文地址:https://www.cnblogs.com/xiongxinxzy/p/13096031.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!