C++繼承時的名字遮蔽問題
阿新 • • 發佈:2020-07-14
如果派生類中的成員(包括成員變數和成員函式)和基類中的成員重名,那麼就會遮蔽從基類繼承過來的成員。所謂遮蔽,就是在派生類中使用該成員(包括在定義派生類時使用,也包括通過派生類物件訪問該成員)時,實際上使用的是派生類新增的成員,而不是從基類繼承來的。
下面是一個成員函式的名字遮蔽的例子:
1.#include<iostream> 2.using namespace std; 3. 4.//基類People 5.class People{ 6.public: 7. void show(); 8.protected: 9. char *m_name; 10. int m_age; 11.}; 12.void People::show(){ 13. cout<<"嗨,大家好,我叫"<<m_name<<",今年"<<m_age<<"歲"<<endl; 14.} 15. 16.//派生類Student 17.class Student: public People{ 18.public: 19. Student(char *name, int age, float score); 20.public: 21. void show(); //遮蔽基類的show() 22.private: 23. float m_score; 24.}; 25.Student::Student(char *name, int age, float score){ 26. m_name = name; 27. m_age = age; 28. m_score = score; 29.} 30.void Student::show(){ 31. cout<<m_name<<"的年齡是"<<m_age<<",成績是"<<m_score<<endl; 32.} 33. 34.int main(){ 35. Student stu("小明", 16, 90.5); 36. //使用的是派生類新增的成員函式,而不是從基類繼承的 37. stu.show(); 38. //使用的是從基類繼承來的成員函式 39. stu.People::show(); 40. 41. return 0; 42.}
本例中,基類 People 和派生類 Student 都定義了成員函式 show(),它們的名字一樣,會造成遮蔽。第 37 行程式碼中,stu 是 Student 類的物件,預設使用 Student 類的 show() 函式。
但是,基類 People 中的 show() 函式仍然可以訪問,不過要加上類名和域解析符,如第 39 行程式碼所示。