2 避免遮掩继承而来的名称
关键字:作用域。
先看一个简单的例子:
int x;
void someFunc() {
double x;
std::cin >> x;
}
这个读取数据的语句使用的是局部变量x,而不是全局变量x。因为内层作用域的名称会遮掩外围作用域的名称。
加入继承机制,有如下的代码:
class Base {
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf2() ;
void mf3();
....
};
class Derived : public Base {
public:
virtual void mf1();
void mf4();
....
};
mf4函数中有如下实现:
void Derived::mf4() {
...
mf2();
...
}
编译器的查找作用域顺序:
local作用域--->class Derived覆盖的作用域
---> class覆盖的作用域(本例到这停止)
---> Base的那个namespace作用域
---> global作用域。
现在来为上面的两个类加几个成员函数:
class Base {
private:
int x;
pubic:
virtual void mf1() = 0;
virtual void mf1( int );
virtual void mf2() ;
void mf3();
viod mf3( double );
....
};
class Derived : public Base {
public:
virtual void mf1();
void mf3();
void mf4();
....
};
这样做会有什么效果呢
Derived d;
int x;
......
d.mf1();
d.mf1(x); //error
d.mf2();
d.mf3();
d.mf3(x); //error
由此可见,基于作用的名称遮掩规则,并没有因为重载函数而特殊处理,那些名字相同的重载函数同样被遮掩掉了。