【问题标题】:C++ unable to use super class' methods?C++ 无法使用超类的方法?
【发布时间】:2012-11-07 18:05:09
【问题描述】:

我现在觉得自己很蠢,好久没学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-方法都运行良好,问题不在它们之内。

【问题讨论】:

  • 这不是缺少的';'在setName() 之后?
  • 不,不是,我显然重写了整个代码。

标签: c++ inheritance methods superclass


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我看出来一定不是你的真实代码。

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

    【讨论】:

    • 这并不意味着这不是他的真实代码。很可能,这就是错误。
    【解决方案3】:

    您看到的是setName 修改了父类中的m_nameprintName 打印出派生类的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;
    };
    

    您也可以将 m_name 设为私有并改用 getName() 方法,正如 moswald 所建议的那样。

    【讨论】:

    • 感谢你们,感谢其他所有人,我现在觉得自己很愚蠢 :D 编写 Python 代码太多,忘记了这么基本的东西。
    • 我会避免使用protected。已经有一个getName;他应该只使用它而不是直接访问m_name
    • 是的,我已经这样做了,只是没有注意到我正在替换 m_name。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2015-10-06
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多