exceptional C++ 上看来的。
#include <iostream>
#include <complex>
using namespace std;
class base{
public:
void f(int){
cout<<"f(int)"<<endl;
}
void f(double){
cout<<"f(double)"<<endl;
}
};
class derived : public base{
public:
//不同作用域
using base::f;
void f(complex<double> ){
cout<<"complex<double>"<<endl;
}
};
int main()
{
derived d;
d.f(1.0);
return 0;
}
基类与派生类的函数并不是默认在同样的作用域中。 如果派生类与基类的函数名相同,那么派生类的函数会直接覆盖基类的函数。
如果试图令基类与子类的函数重载, 就需要利用
using base::f 这个语句。
在上面的代码中,如果没有这个语句, 程序的输出会是
complex<double>, 因为C++不会将这个调用与基类的函数进行匹配。 这个结果的产生是由于double 到 complex<double> 的隐式转换。