首页 > 其他 > 详细

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

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

关键点一:将虚函数定义为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.掉血函数在运行期可变。

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!