C++类的函数重载

本文讨论C++中类的函数重载。

下面的一个例子

#include <iostream>
using namespace std;

class Base{
public:
        int display(int n_count){
                cout <<"display function defined in the Class Base"<<endl;
                return 0;
        }
};

class Derived:public Base{
public:
        int display(int n_count,int n_width){
                cout << "display function defined in the Class Derived"<<endl;
                return 0;
        }
};

int main(int argc,char** argv){
        Base *p_base;
        Derived *p_derived = new Derived();
        p_base = p_derived;
        p_derived->display(8);
        p_derived->display(10,20);
        return 0;
}
上面这个程序是不能通过编译的,因为在类Derived中并不存在display(int)函数,这里有一个疑问:不是从类Base继承了display(int)函数?

这里有两个方面:

  1. 类Derived确实从类Base继承了display(int)函数,并且自己也定义了一个display(int,int)函数,所以类Derived有两个名为display的函数。
  2. 但是从类Base继承过来的display(int),被继承之后,又被类Derived定义的display(int,int)函数屏蔽了。
所以编译器在调用p_derived->display(8)时,过程如下:
  1. 先寻找名为display的函数,在类Derived中就找到了。
  2. 进行类型检查,失败,继而报错。
这里的问题,就是由于重载的问题导致的,C++重载要求:每一个不同的版本重载函数,都要求在同一个作用域中出现。在类Derived中,虽然有两个display函数,但其作用域分别是Base::和Derived::两个类作用域。

可以在类Derived中重新定义display(int,int)函数,以实现display在类Derived中的重载,但是如果Base类中定义了多个display的版本,岂不是都要重写?此时,C++提供using 语句可以解决这个问题:
using Base::display;
这样,类Derived的定义如下:
class Derived:public Base{
public:
        void function(){
                cout<<"virtual function in the Class Derived"<<endl;
        }
        using Base::display;
        int display(int n_count,int n_width){
                cout << "display function defined in the Class Derived"<<endl;
                return 0;
        }
};
按照这样的定义,编译通过。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值