C ++派生类访问基类成员

时间:2017-01-23 03:22:23

标签: c++ class inheritance

可能是一个非常简单的问题,但我有一段时间想到这一点。我有一个基类:

class User
{
    public:
      User();
      ~User();
      void GetUser();
      void SetUser();
    protected:
      std::string name;
};

这是我的派生类:

class UserInfo: public User
{
  public:
    void GetUser();
};

方法:

User::User()
{
  name = "";
}

void User::GetUser()
{
  cout << name;
}

void User::SetUser()
{
  cin >> name;
}

User::~User()
{
  name = "";
}

void UserInfo::GetUser()
{
  cout << "  ";
  User::GetUser();
  cout << ", you entered: ";
}

一切似乎都运行良好,但是当我从程序中调用UserInfo :: GetUser()时,它不会执行或检索存储在User类的name成员中的值。我如何获得这个价值?感谢。

1 个答案:

答案 0 :(得分:3)

您的功能名称及其功能可以改进。不要将成员变量与cincout混合使用。我建议更改功能如下。

class User
{
    public:
      User();
      ~User();

      // Make the Get function a const member function.
      // Return the name.
      std::string const& GetName() const;

      // Take the new name as input.
      // Set the name to the new name.
      void SetName(std::string const& newName);

    protected:
      std::string name;
};

并将它们实现为:

std::string const& User::GetName() const
{
  return name;
}

void User::SetName(std::string const& newName)
{
  name = newName;
}

之后,您不需要GetUser中的UserInfo成员函数。

准备好设置User的名称时,请使用:

User u;
std::string name;
std::cin >> name;
u.SetName(name);

这允许您将User的名称设置与您从该名称中获取的名称分开。

当您准备打印名称User时,请使用:

std::cout << u.GetName();

这使您可以在获取名称后将User的名称与获取名称的方式分开。