参数:http://www.weixueyuan.net/view/6361.html
总结:
如果派生类中新增一个成员变量,该成员变量与基类中的成员变量同名,则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理,如果派生类中新增的成员函数与基类中的成员函数同名,则该新增的成员函数就会遮蔽从基类中继承过来的成员函数。
被遮蔽了的基类的成员变量或成员函数并非是没有继承过来,而仅仅是被派生类的同名成员变量和成员函数给遮蔽了,调用的时候需要用到类名加上域解析操作符。
------------------
如果派生类中新增一个成员变量,该成员变量与基类中的成员变量同名,则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理,如果派生类中新增的成员函数与基类中的成员函数同名,则该新增的成员函数就会遮蔽从基类中继承过来的成员函数。
例1:
#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,之后通过继承basic类派生出derived类。需要注意的是在basic类中定义了一个成员变量x,该变量是int型,与之对应的成员函数是setx和getx函数。而派生类中同样定义了一个成员变量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)。
从上例中,我们可以看出被遮蔽了的基类的成员变量或成员函数并非是没有继承过来,而仅仅是被派生类的同名成员变量和成员函数给遮蔽了,调用的时候需要用到类名加上域解析操作符。