2017-01-23 137 views
1

可能是一个非常简单的问题,但我有一个时间的魔鬼搞清楚这一点。我有一个基类:C++派生类访问基类成员

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类的名称成员中的值。我如何得到这个价值?谢谢。

+1

显示的代码没有任何明显的错误(当然,没有什么与指定的问题直接相关)。因此,问题必须出现在未显示的代码中。 –

+1

显示调用GetUser()的代码。也许你想在'User'类中使用'virtual void GetUser();'而不是'void GetUser();'。 – drescherjm

+2

[Works for me](http://rextester.com/PUMIM54797) –

回答

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; 
} 

之后,你不需要在UserInfoGetUser成员函数。

当你准备设置的User,使用名称:

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

这使您可以分离User的名字从那里你从名称的设置。

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

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

这使您可以分离User的名字从你如何使用的名字你得到它后获得。

相关问题