C++ 函数遮蔽
子类中和父类中有同名函数(与参数无关),父类同名函数无法被访问到。
如果确实需要调用父类的同名函数,有两种办法:
- 在子类的成员函数中调用。用父类::函数名,能够强制调用父类同名成员函数。
void Man::sanmenamefunc(int a) {
Human::sanmenamefunc();//调用父类的
Human::sanmenamefunc(12);//调用父类的
cout << "Man::sanmenamefunc(int a)" << endl;
}
- 使用using
c++11中新增加的功能:让父类同名函数在子类可见。可供子类对象调用。
通过using这个c++11中的关键字,让父类的同名函数在子类中可见。让父类同名函数子类中以重载的形式使用。
如果子类父类的函数名参数一样,调用子类的。
class Man : public Human //表示Men是Humen的子类
{
public:
int houjie;
public:
Man();
public:
void sanmenamefunc(int);
public:
using Human::sanmenamefunc;//直接分号
};//类结尾一定要分号
如果想调用父类的同名同参的还等用父类::函数名。
说明:
- using Human::sanmenamefunc; 是种声明,只能指定函数名。凡是基类中的public,protected函数都能暴露到子类,子类可见。无法只暴露一部分。
- 目的是让子类的实例中,调用父类的重载版本。
Man m;
m.sanmenamefunc(10);//先检查子类有没有匹配函数,如果调用子类的。如果没有检查父类。如果子类不加using,不检查父类,子类中没有匹配的函数直接报错。