一,应用场景
假设我们在设计一款游戏,我们为游戏中的人物设计一个继承体系,不同的人物有不同的计算健康程度的方法,因此我们在基类中声明一个虚函数
class GameCharacter{
public:
virtual int healthValue() const; //返回人物的健康指数
};
//前置声明
class GameCharacter;
//计算健康指数的缺省方法
int defaultHealthFunc(const GameCharacter& gc){}
class GameCharacter{
private:
HealthFunc healthFunc;
public:
typedef int (*HealthFunc)(const GameCharacter& gc);
GameCharacter(HealthFunc hf = defaultHealthFunc):healthFunc(hf){
}
};
1,同一人物类型之不同实体可以有不同的计算健康指数的方法
int func1(const GameCharacter& gc){}
int func2(const GameCharacter& gc){}
EvilBadGuy ebg1(func1); //相同类型的人物,有不同的计算健康的方式
EvilBadGuy ebg2(func2);
2,某已知人物之健康指数计算函数可以在运行期变更
例如:GameCharacter可提供一个成员函数setHealthFunc,用来替换当前的健康指数计算函数。
//前置声明
class GameCharacter;
//计算健康指数的缺省方法
int defaultHealthFunc(const GameCharacter& gc){}
class GameCharacter{
private:
HealthFunc healthFunc;
public:
typedef int (*HealthFunc)(const GameCharacter& gc);
GameCharacter(HealthFunc hf = defaultHealthFunc):healthFunc(hf){
}
void setHealthFunc(HealthFunc hf){
healthFunc = hf;
}
};
int func1(const GameCharacter& gc){}
int func2(const GameCharacter& gc){}
EvilBadGuy ebg;
ebg.setHealthFunc(func1);
ebg.setHealthFunc(func2);