1

我现在觉得很愚蠢,很久没有做 C++ 了,不明白出了什么问题……但是我得到了以下课程:

#include <string>
class NamedObject
{
    public:
        NamedObject();
        virtual ~NamedObject();
        virtual std::string getName() const { return m_name };
        virtual void setName(const std::string name) { m_name = name };
    private:
        std::string m_name;
};

现在我继承了一个简单的类:

#include "NamedObject.h"
enum eTeam { eAttacker, eDefender, eSpectator, eNone };
class Player : public NamedObject
{
    public:
        Player();
        virtual ~Player();
        virtual void printName();
        virtual eTeam getTeam() const { return m_team };
        virtual void setTeam(const eTeam team) { m_team = team };
    private:
        std::string m_name;
        eTeam m_team;
};

但是,我无法在 main.cpp 中使用 player->setName("blabla")?这是主文件:

#include "Player.h"
int main()
{
    Player* p1 = new Player();
    p1->setName("Name Changed!")
    p1->printName(); // prints "Unnamed" since I declared that in default ctor
    return 0;
}

我没有收到任何错误,一切运行良好,名称并没有简单地改变。此外,我得到了所有的构造函数和析构函数,以及我的printName-method 工作正常,问题不在它们之内。

4

3 回答 3

4

您看到的是setName修改了m_name父类中的 并printName打印出m_name派生类的 ,因为您在std::string m_name;派生类中重新声明。

从派生类中删除声明并标记m_name为父protected类中的成员:

#include <string>
class NamedObject
{
public:
    NamedObject();
    virtual ~NamedObject();
    virtual std::string getName() const { return m_name };
    virtual void setName(const std::string name) { m_name = name };
protected:
    std::string m_name;
};

正如 moswald 所建议的,您也可以保持m_name私有并使用该方法。getName()

于 2012-11-19T18:57:17.140 回答
2

m_name您在派生类中创建了另一个不同的变量,它隐藏了父类中的变量。

于 2012-11-19T18:55:14.390 回答
0

我可以看到这一定不是您的真实代码。

您的派生/超类正在重新声明 m_name。可能不是你的意思;)

于 2012-11-19T18:55:45.467 回答