同名隐藏
不同作用域声明的标识符的可见性原则:
若存在多个具有包含关系的作用域,外层声明了一个标识符 ,①内层没有再声明同名标识符,那么外层的标识符在内层依然可见。②内层声明了同名标识符,则外层标识符在内层中不可见。
这种即为隐藏规则。
同名隐藏在继承中的体现:
在类的派生中,基类成员和派生类成员都有类作用域,二者是相互包含的两层,派生类在内层。所以若派生类声明了与基类同名的新属性/新函数(即使参数表不同),则触发了隐藏规则。(从基类继承的同名函数的所有重载形式也被隐藏)
若要访问被隐藏的成员,需要用作用域分辨符::和基类名来限定。
//demo1 属性的同名隐藏
class Parent
{
public:
int m;
Parent()
{cout<<"Parent():"<<"&m="<<&m<<endl;}
};
class Child:public Parent
{
public:
int m;
Child()
{cout<<"Child():"<<"&m="<<&m<<endl;}
};
main
{
Child c;
c.m=100;
c.Parent::m=1000;
cout<<"&c.m="<<&c.m<<endl;
cout<