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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++的虚函数有三个主要特点: 1. 多态性(Polymorphism):虚函数允许在派生类重新定义与基类相同签名的函数。当通过基类指针或引用调用虚函数时,实际执行的是派生类的版本。这为实现运行时多态性提供了方便,使得程序能够根据对象的实际类型来决定调用哪个函数。 2. 动态绑定(Dynamic Binding):虚函数使用动态绑定机制,即在运行时根据对象的实际类型绑定调用的函数。这意味着在派生类对象被创建后,可以通过基类指针或引用来调用相应的派生类函数,而不需要提前知道它的具体类型。这样的绑定方式提高了程序的灵活性和可提供的操作选择。 3. 调用顺序是按照继承关系自上而下的:虚函数允许通过基类指针或引用调用派生类函数,但是调用的函数是按照继承关系依次向下查找,直到找到与基类函数签名相符的函数为止。如果派生类没有重定义虚函数,则会调用基类的虚函数。这使得派生类可以通过重写、扩展或修改基类函数的功能,以适应自身的特定需求。 这三个特点使得虚函数在面向对象的程序设计起到重要的作用。它们允许不同类型的对象通过共同的接口进行交互,增加了程序的可扩展性和可维护性。同时,虚函数也是实现封装和抽象的重要手段之一,通过隐藏实现细节,使得多个相关的类能够以一致的方式进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值