在有效的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
的初始化程序中?