当位于一个子类成员函数内指涉父类内的某物时,编译器可以找出我们所指涉的东西,意味子类继承了声明于父类内的所有东西。实际运作方式是:子类的作用域被嵌套在父类的作用域中,但在子类找不到定义时,作用域替换为父类的作用域。
class Base{
private:
int x;
public:
virtual void mf1() =0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
...
};
class Derived: public Base {
public:
virtual void mf1();
void mf3();
void mf4();
...
};
Derived d;
int x;
...
d.mf1(); //没问题,调用derived::mf1
d.mf1(x); //错误!因为Derived::mf1遮掩Base::mf1
d.mf2(); //没问题,调用Base::mf2
d.mf3(); //没问题,调用Derived::mf3
d.mf3(x); //错误!因为Dervied::mf3 遮掩了Base::mf3
即使子类和父类内的函数有不同的参数类型也会覆盖作用域,因为是按照函数名在作用域中寻找声明式,如果在子类找到无参的函数名,就不会再去父类找有参的函数名。如果子类没有声明式,就会报错。
你可以使用using 声明式达成目标
class Base{
private:
int x;
public:
virutal void mf1() =0;
virtual void mf1(int );
virtual void mf2();
void mf3();
void mf3(double);
.....
};
class Derived:public Base{
public:
using Base::mf1; //让Base class内名为mf1和mf3的所有东西在Derived作用域都可见。
using Base::mf3;
virtual void mf1();
void mf3();
void mf4();
...
};