好的,我来自Java,目前正试图找出这个C ++的东西。所以我一直在涂鸦,我有一个基本的继承继续进行基本的RPG游戏类型的事情。 这是关于层次结构的概述:
Being (Base object that contains a pointer to a Race)
Race (Base Class)
-Elf (derived class)
-Human (derived class)
所以在Being
的构造函数中,我有以下代码:
int str,
intl,
wis,
dex,
HP,
tHP;
string name;
Race *race;
public:
//Send a reference to an object of a SUBCLASS of Race.
Being(string name, Race *r)
:name(name), race(r){
str = 10;
intl = 10;
wis = 10;
dex = 10;
tHP = 15;
HP = tHP;
race->applyStats(this);
}
当我说race->applyStats(this)
时,我的问题就出现了。虽然从语法上来说这成功地调用了applyStats
的{{1}}方法,但是我想让它调用子类之一。例如,我有一个名为Race
的类,如下所示:
Elf
主要是我运行这段代码:
class Elf : public Race{
public:
Elf()
:Race("Elf"){
}
void applyStats(Being *being){
cout << "entered" <<endl;
being->setStr( being->getStr() - 2 );
being->setWis( being->getWis() + 2 );
being->setTHP( being->getTHP() - 2 );
}
};
示例输出:
Being b ("Tanis", new Elf());
//Don't worry about printStats(), it just lists the stats as the sample output shows
b.printStats();
呀。所以我真的不明白,也许我已经习惯了Java,但是当我说 -Tanis-
Race Elf
Strength 10
Intelligence 10
Wisdom 10
Dexterity 10
Health 15/15
时,它不应该调用applyStats(this)
的{{1}}吗?
答案 0 :(得分:3)
在类Race函数中,applyStats必须声明为virtual。例如
virtual void applyStats( const Being *being) const;
(我改变了一点声明)
另外,不要忘记将基类的析构函数定义为虚拟。
如果仅使用派生类的对象,也可以将Race类定义为abstract。例如
virtual void applyStats( const Being *being) const = 0;