effective c++条款35中的问题
在藉由Function Poiter实现strategy模式中,他给出这么一个例子:
class GameCharacter; // 前置声明
// defaultHealthCalc函数:计算生命值的默认算法
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter {
public:
typedef int (*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
: healthFunc(hcf)
{}
int healthValue() const
{ return healthFunc(*this); }
...
private:
HealthCalcFunc healthFunc;
}
对应的派生类为:
class EvilBadGuy: public GameCharacter {
public:
explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc)
: GameCharacter(hcf)
{ ... }
...
};
int loseHealthQuickly(const GameCharacter&); // 不同计算方式的
int loseHealthSlowly(const GameCharacter&); // 生命值计算函数
EvilBadGuy ebg1(loseHealthQuickly); // 同一类型的角色
EvilBadGuy ebg2(loseHealthSlowly); // 使用不同类型的
// 生命值计算方法
我的问题是:基类和派生类的构造函数形参是HealthCalcFunc类型的函数指针,而这个函数指针的参数又是一个基类的引用。这样的实现似乎不太可能啊?因为这个函数指针的实参没办法获得。我构造GameCharacter 或者EvilBadGuy对象的时候,却需要一个这个类型的对象来调用函数指针。
不知道我的理解是不是有问题?
[解决办法]
构造GameCharacter 对象的时候并不需要调用函数指针
[解决办法]
因为这个函数指针的实参没办法获得?
构造函数里传入一个函数指针 只是给那个函数指针成员赋值罢了。
此时并没有调用health的计算函数
真正调用是在构造函数完成以后
这时候的对象已经构造完成
可以作为一个参数
为什么不太可能?