C++中的函数隐藏机制, 简而言之就是,在C++中子类覆盖父类同名函数(同函数名,同参数)的同时,如果父类中含有同函数名的函数,那么后者会被隐藏掉。如下所示,直接使用d.func();编译会报错。
#include <iostream>
using namespace std;
class Base{
public:
int func(){
cout<<__FUNCTION__<<endl;
return 0;
}
int func(int a){
cout<<__FUNCTION__<<"(int a)"<<endl;
return a;
}
int func(int a,int b){
cout<<__FUNCTION__<<"(int a,int b)"<<endl;
return 2;
}
// 上面三个func是重载关系
};
class Derived : public Base{
public:
// Derived::func(int a) 覆盖了 Base::func(int a)
// 同时也隐藏了 Base::func() 和 Base::func(int a,int b)
int func(int a){
cout<<"Derived::"<<__FUNCTION__<<"(int a)"<<endl;
return 11;}
};
int main() {
Derived d;
d.func(2);
//d.func();//此处调用失败
d.Base::func(); // 需要这样 显示调用才行
return 0;
}
如何解决这个问题,一个是通过显式调用d.Base::func();另一个方法就是通过using在子类中引入,代码如下:
class Derived : public Base{
public:
// Derived::func(int a) 覆盖了 Base::func(int a)
// 同时也隐藏了 Base::func() 和 Base::func(int a,int b)
using Base::func;// here !
int func(int a){
cout<<"Derived::"<<__FUNCTION__<<"(int a)"<<endl;
return 11;}
};
函数隐藏机制, C++ 为什么会有这样的机制?
如果不是看到C++11 using的这个用途,还真没在意到这一点。
我们假设,没有隐藏机制,子类可以继承父类的其他所用同名的函数,那么会出现什么问题?
单继承是没问题的,多继承呢,如果派生类继承自Base1, Base2。而两个基类都用好几个func函数,那么派生类该使用哪一个呢?
引入函数隐藏机制,就解决了这个问题,如果使用Base1,就using Base1::func; 使用Base2中的函数,就using Base2::func;
函数隐藏机制,算是C++比较隐蔽的一个知识点了。如果是单继承,确实没有隐藏的必要,即便是多继承,两个父类没有冲突的函数,也没必要。说它设计的不好,但也想不出其他什么更好的方案。