【发布时间】:2019-02-21 04:50:07
【问题描述】:
Base 和 Derived 定义如下:
class Base {
public:
virtual int f1(int a) const = 0;
virtual int f2(int a, int b) const { return a+b;}
};
class Derived : public Base {
public:
int f1(int a) const { return a; }
};
int main() {
Derived obj;
cout << obj.f1(1) << endl;
cout << obj.f2(1, 2) << endl;
}
结果是
1
3
obj.f1(1) 使用 Derived 和 obj.f2(1, 2) 中的 f1 实现em> 使用继承自 Base 的实现,这正是我想要的。
现在,我希望这两个函数具有相同的名称,f,因此当有两个参数时,基类提供了一个实现,而派生类必须实现单参数版本(即为什么它是纯虚拟的)。
但是,如果我这样做(只需将 f1 和 f2 重命名为 f):
class Base {
public:
virtual int f(int a) const = 0;
virtual int f(int a, int b) const { return a + b;}
};
class Derived : public Base {
public:
int f(int a) const { return a; }
};
int main() {
Derived obj;
cout << obj.f(1) << endl;
cout << obj.f(1, 2) << endl;
}
我收到以下错误:
20:23: error: no matching function for call to 'Derived::f(int, int)'
20:23: note: candidate is:
14:13: note: virtual int Derived::f(int) const
14:13: note: candidate expects 1 argument, 2 provided
这是为什么?这种重载是不可能的吗?
【问题讨论】:
-
@StoryTeller 确实如此。当我进行研究时,我认为这与其中一个纯虚拟功能有关,所以我想这就是我没有找到这个问题的原因。这个答案:stackoverflow.com/a/1629074/1755482 很好地解释了 name hide 现象。
标签: c++