1. 程式人生 > 實用技巧 >C++繼承時的名字遮蔽問題

C++繼承時的名字遮蔽問題

如果派生類中的成員(包括成員變數和成員函式)和基類中的成員重名,那麼就會遮蔽從基類繼承過來的成員。所謂遮蔽,就是在派生類中使用該成員(包括在定義派生類時使用,也包括通過派生類物件訪問該成員)時,實際上使用的是派生類新增的成員,而不是從基類繼承來的。

下面是一個成員函式的名字遮蔽的例子:

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 行程式碼所示。