类Base
具有方法void foo(float a)
。类Sub
从Base
公开继承,并具有方法void foo(int a)
。
我有s
个Sub
的实例(存储在Sub*
中),并调用s->foo(1.5)
。 Sub::foo
被执行(参数被截断为1
),而不是Base::foo
。为什么会这样?
我很天真地希望它执行Base
中定义的原始方法,因为该参数是一个浮点数。我该如何实现呢?
答案 0 :(得分:4)
使用
struct Base
{
void foo(float a);
};
struct Sub : Base
{
void foo(int a); // Hides Base::Foo
};
Sub::foo
隐藏Base::foo
,
您必须添加using
才能允许两个重载。
struct Sub : Base
{
using Base::foo;
void foo(int a);
};
有关using_declaration的更多详细信息
与您通话:
Sub s;
s.foo(1.5); // Ambiguous with using, Sub::foo(int) without using.
不使用时,仅考虑一次重载,因此调用Sub::foo(int)
。
对于using
,考虑了两个重载,但是两个重载都不比另一个重载更好,因此模棱两可。