C++中的函数隐藏机制

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++比较隐蔽的一个知识点了。如果是单继承,确实没有隐藏的必要,即便是多继承,两个父类没有冲突的函数,也没必要。说它设计的不好,但也想不出其他什么更好的方案。

猜你喜欢

转载自blog.csdn.net/niu91/article/details/109485455