C ++从父指针访问子方法

时间:2014-04-14 22:56:24

标签: c++ pointers inheritance

好的,我来自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}}吗?

1 个答案:

答案 0 :(得分:3)

在类Race函数中,applyStats必须声明为virtual。例如

virtual void applyStats( const Being *being) const;

(我改变了一点声明)

另外,不要忘记将基类的析构函数定义为虚拟。

如果仅使用派生类的对象,也可以将Race类定义为abstract。例如

virtual void applyStats( const Being *being) const = 0;