наследование — 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;
};

Тем не менее, я не могу использовать player-> setName («blabla») из моего main.cpp? Вот основной файл:

#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-метод работает отлично, и проблема не в них.

1

Решение

То, что вы видите, это то, что 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;
};

Вы также можете сохранить m_name частный и использовать метод getName() вместо этого, как предполагает Моссвальд.

4

Другие решения

Вы создали другую переменную m_name в вашем производном классе, который затенял тот в родительском классе.

2

Я вижу, что это не должно быть вашим реальным кодом.

Ваш производный / суперкласс перераспределяет m_name. Наверное, не то, что вы хотите сделать;)

0
По вопросам рекламы [email protected]