一,避免遮掩继承而来的名称
下面是一个类的继承结构,derived class继承了声明于base class内的所有东西,derived class作用域被嵌套在base class作用域内。以作用域为基础的名称遮掩规则并没有改变,因此base class内所有名为func1与func3的函数都被derived class内的func1与func3函数遮掩掉了,因此会有下面的输出结果:
class Base{
public:
virtual void func1();
virtual void func1(int);
void func2();
void func3();
void func3(double);
};
class Derived : public Base{
public:
virtual void func1();
void func3();
void func4();
};
Derived d;
d.func1(); //没问题,调用Derived::func1
d.func1(10); //错误,因为Derived::func1遮掩了Base::func1
d.func2(); //没问题,调用Base::func2
d.func3(); //没问题,调用Derived::func3
d.func3(2.5); //错误,因为Derived::func3遮掩了Base::func3
即使base class与derived class内的函数有不同的参数类型也适用,而且不论是virtual还是non-virtual一体适用。可以使用using声明,来推翻C++对继承而来的名称的缺省遮掩行为。
Derived d;
d.func1(); //没问题,调用Derived::func1
d.func1(10); //没问题,调用Base::func1
d.func2(); //没问题,调用Base::func2
d.func3(); //没问题,调用Derived::func3
d.func3(2.5); //没问题,调用Base::func3
derived class内的名称会遮掩base class内的名称,为了让遮掩的名称可以在derived class中看到,可以使用using声明。