本文讨论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)函数?
这里有两个方面:
- 类Derived确实从类Base继承了display(int)函数,并且自己也定义了一个display(int,int)函数,所以类Derived有两个名为display的函数。
- 但是从类Base继承过来的display(int),被继承之后,又被类Derived定义的display(int,int)函数屏蔽了。
所以编译器在调用p_derived->display(8)时,过程如下:
- 先寻找名为display的函数,在类Derived中就找到了。
- 进行类型检查,失败,继而报错。
这里的问题,就是由于重载的问题导致的,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;
}
};
按照这样的定义,编译通过。