2017-01-23 220 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的名字從你如何使用的名字你得到它後獲得。

相關問題