【发布时间】:2018-04-22 22:20:32
【问题描述】:
我有一个Base 类,它提供一些业务逻辑和虚拟方法,可以进一步覆盖。另外,我想用Decorator 扩展一些从Base 继承的类。这是简化的设置:
struct Base
{
~Base() = default;
virtual void foo(int) {};
virtual void foo(double) {};
};
template<typename T>
struct Decorator : public T
{
};
struct Middle : public Decorator<Base>
{
virtual void foo(int) override {};
};
struct Final : public Middle
{
virtual void foo(double) override {};
};
当我使用 clang 和 -Wall -Wextra 编译代码时,我收到以下警告:
21 : <source>:21:18: warning: 'Final::foo' hides overloaded virtual function [-Woverloaded-virtual]
virtual void foo(double) override {};
^
16 : <source>:16:18: note: hidden overloaded virtual function 'Middle::foo' declared here: type mismatch at 1st parameter ('int' vs 'double')
virtual void foo(int) override {};
^
GCC 没有抱怨,老实说,我不知道 clang 在这里发现了什么问题。
我使用 Compiler Explorer 运行最近的 clang 和 GCC:https://godbolt.org/g/fC5XXT
【问题讨论】:
-
在
Middle中添加覆盖foo(double)的有趣之处在于解决了这个问题。因此,您可以通过在此额外覆盖中调用基类方法来解决此问题。 -
一个非常相似的问题:stackoverflow.com/questions/6727087/…
-
警告正确;
foo(double)在Final中隐藏foo(int)在中间。如果您创建Final的实例并说foo(1),它将调用double版本。 -
Martin Bonner 的回答是正确的——这与隐藏规则有关。我还关闭了这个问题,因为它与隐藏规则阻止编译的类似情况重复。
标签: c++