C++名字隐藏
如果派生类中新增一个成员变量,该成员变量与基类中的成员变量同名,则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理,如果派生类中新增的成员函数与基类中的成员函数同名,则该新增的成员函数就会遮蔽从基类中继承过来的成员函数。
举个例子:
在派生类 derived 中,setx(char *) 与基类继承过来的 setx(int) 函数同名,派生类新增的函数 setx(char *) 遮蔽了从基类继承而来的 setx(int) 函数。如此一来,通过 d1.setx(50) 调用 setx(int) 是不成功的,故而出现编译错误,正确的调用方法是通过类名来调用
从上例中我们可以看出,被遮蔽了的基类的成员变量或成员函数并非是没有继承过来,而仅仅是被派生类的同名成员变量和成员函数给遮蔽了,调用的时候需要用到类名加上域解析操作符。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
举个例子:
#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)
。从上例中我们可以看出,被遮蔽了的基类的成员变量或成员函数并非是没有继承过来,而仅仅是被派生类的同名成员变量和成员函数给遮蔽了,调用的时候需要用到类名加上域解析操作符。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。