C++名字隐藏

如果派生类中新增一个成员变量,该成员变量与基类中的成员变量同名,则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理,如果派生类中新增的成员函数与基类中的成员函数同名,则该新增的成员函数就会遮蔽从基类中继承过来的成员函数。

举个例子:
#include<iostream>
using namespace std;

class basic
{
public:
    void setx(int a){x = a;}
    void sety(int b){y = b;}
    int getx(){return x;}
    int gety(){return y;}
private:
    int x;
    int y;
};

class derived : public basic
{
public:
    void setx(char *a){x = a;}
    char* getx(){return x;}
private:
    char * x;
};

int main()
{
    derived d1;
    d1.setx("class");   //OK
    d1.setx(50);        //compile error
    d1.basic::setx(50); //OK
    return 0;
}
basic 基类中定义了一个成员变量 x,该变量是 int 型,与之对应的成员函数是 setx() 和 getx() 函数。而 derived 派生类中同样定义了一个成员变量 x,而它是 char 指针类型,与之对应的成员函数是 setx() 和 getx() 函数。主函数中定义了 derived 类的对象 d1,我们在调用 setx(char *) 函数时,没有问题。接着又调用从基类中继承过来的 setx(int) 函数,结果编译出错。最后通过类名来调用基类继承过来的 setx(int) 函数,编译通过。

在派生类 derived 中,setx(char *) 与基类继承过来的 setx(int) 函数同名,派生类新增的函数 setx(char *) 遮蔽了从基类继承而来的 setx(int) 函数。如此一来,通过 d1.setx(50) 调用 setx(int) 是不成功的,故而出现编译错误,正确的调用方法是通过类名来调用d1.basic::setx(int)

从上例中我们可以看出,被遮蔽了的基类的成员变量或成员函数并非是没有继承过来,而仅仅是被派生类的同名成员变量和成员函数给遮蔽了,调用的时候需要用到类名加上域解析操作符。