在 Effective C++,第 3 版,第 173~175 页中,Scott Meyers 谈到了使用策略模式的虚拟函数的替代方案:
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
类的构造函数需要一些函数,该函数接受与 a 兼容的参数const GameCharacter&
并返回可转换为int
.
这是否由中operator()
定义的支持/实现struct HealthCalculator
?我不太明白这里这个重载运算符的含义。
我这里的另一个问题是派生类的构造函数中的初始化列表通常只初始化其自身的数据成员(尽管我知道派生类的基础部分也被隐式初始化)。基类怎么会GameCharacter
出现在派生类的初始化器中EyeCandyCharacter
?