派生クラスで定義されたメソッドを呼び出すと、コンパイラエラーが発生します。コンパイラは、私が参照しているオブジェクトが基本クラスタイプであると考えているようです。
weapon = dynamic_cast<Weapon*>(WeaponBuilder(KNIFE)
.name("Thief's Dagger")
.description("Knife favored by Thieves")
.attack(7) // error: class Builder has no member called attack
.cost(10) // error: class Builder has no member called cost
.build());
確かに、またはのいずれかBuilder
が含まれていません:attack
cost
class Builder
{
protected:
string m_name;
string m_description;
public:
Builder();
virtual ~Builder();
virtual GameComponent* build() const = 0;
Builder& name(string);
Builder& description(string);
};
しかし、派生クラスWeaponBuilder
は次のことを行います。
enum WeaponType { NONE, KNIFE, SWORD, AXE, WAND };
class WeaponBuilder : public Builder
{
int m_cost;
int m_attack;
int m_magic;
WeaponType m_type;
public:
WeaponBuilder();
WeaponBuilder(WeaponType);
~WeaponBuilder();
GameComponent* build() const;
// should these be of reference type Builder or WeaponBuilder?
WeaponBuilder& cost(int);
WeaponBuilder& attack(int);
WeaponBuilder& magic(int);
};
attack
コンパイラがクラス内のまたはcost
メソッドを見つけることができない理由はわかりませんWeaponBuilder
。これは明らかに存在するためです。また、オブジェクトが基本クラスのインスタンスとして認識される理由もわかりませんBuilder
。