【发布时间】:2013-07-07 13:06:14
【问题描述】:
我试图了解派生类是否重载了基类 func,(基类具有 int 参数,der 类具有 double 参数)当我创建 der 类实例并使用正确参数调用 func 名称时,仅调用 der func ??有人可以帮助我吗.. 代码的第 28 行有没有办法 (dd.f(d1);) ,我可以获得基类 func 调用。
这里是代码。
using namespace std;
class base {
public :
virtual void f (int i);
};
class der : public base{
public:
void f ( double d);
};
void base::f(int i){
cout << "Base::f \n";
}
void der::f(double d){
cout <<"Der::f \n";
}
int main(){
der dd;
int i =99;
double d1 = 3232.232;
dd.f(i); // why this calls der class func???
dd.f(d1);
base *ptr = new der();
ptr->f(i);
dynamic_cast<der *>(ptr)->f(d1);
return 0;
}
【问题讨论】:
-
编译器不会在多个范围内搜索重载。它在类层次结构中找到“f(...)”的第一个版本并停在那里。然后它将搜索该类并且仅搜索该类的重载。它发现 der::f(double) 作为重载,隐式转换为从 int 到 double 并使用它。你可以把“使用 base::f;”在 "der" 中得到你想要的行为。
标签: c++ inheritance