在有效的C++,第3版,第173〜175,斯科特迈尔斯谈到使用策略模式替代虚函数:重载操作(c)中++结构
class GameCharacter;
int defaultHealthCalc(const GameCharacter& gc);
class GameCharacter {
public:
typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;
explicit GameCharacter(HealthCalcFUnc hcf = defaultHealthCalc)
: healthFunc(hcf)
{}
int healthValue const
{ return healthFunc(*this) }
...
private:
HealthCalcFunc healthFunc;
};
...
struct HealthCalculator {
int operator()(const GameCharacter&) const
{ ... }
};
...
class EyeCandyCharacter: public GameCharacter {
explicit EyeCandyCharacter(HealthCalcFunc hcf=defaultHealthCalc)
:GameCharacter(hcf)
{ ... }
...
}
...
EyeCcandyCharacter ecc(HealthCalculator());
最后一个语句是说明如何在EyeCandyCharacter
类的构造函数中使用健康计算函数对象。
我的问题是,EyeCandyCharacter
类的构造函数需要一些函数,它需要一个兼容const GameCharacter&
的参数并返回可转换为int
的东西。
这是由struct HealthCalculator
中定义的operator()
支持/实施的吗?我不太明白这个重载操作符的含义。
这里的另一个问题是,派生类的构造函数中的初始化列表通常只初始化它本身的数据成员(尽管我知道派生类的基本部分也是隐含地初始化的)。基类GameCharacter
如何出现在派生类EyeCandyCharacter
的初始化程序中?