除寻函数外的其他多态方法
Posted xiongxinxzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了除寻函数外的其他多态方法相关的知识,希望对你有一定的参考价值。
关键点一:将虚函数定义为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.掉血函数在运行期可变。
以上是关于除寻函数外的其他多态方法的主要内容,如果未能解决你的问题,请参考以下文章