【问题标题】:No warning for hiding non-virtual methods with similar prototype (G++ 4.4)没有警告隐藏具有相似原型的非虚拟方法(G++ 4.4)
【发布时间】:2011-11-21 15:03:35
【问题描述】:

在我们的项目中,在派生类中,基类中的非虚拟方法会被具有相同原型的方法隐藏(很少但会发生)。在这种情况下,编译器(在我们的例子中是 g++ 4.4)保持安静。虽然我可以看到没有警告对私有方法有用,但对于受保护或公共方法,这至少应该是一个可配置的警告。

如果存在这样的东西,我找不到它。

这是我想让 g++ 抱怨的一个小例子(请放心,这种代码模式永远不会一次性写成这样,通常工作在某个时间点是 A 中的一个虚拟方法,并且是后来莫名其妙改了):

class A
{
public:
    void work(int p)
    { /* do something */ }
};

class B : public A
{
public:
    void work(int p) 
    { /* do something different */ }
};

结果:即使使用 -Wall -Wextra 也没有警告。

【问题讨论】:

  • 从编译器的角度来看,您的示例没有任何可疑之处,因此没有警告。但是,我同意找到这些重载可能会很好,因此某种信息消息的标志可能会很好。
  • GCC 4.7 最终将实现新的 C++11 final/override 关键字,这应该会有所帮助...

标签: c++ compilation g++


【解决方案1】:

您没有覆盖该方法,而是隐藏了它。这是一个 C++ 特性。

你可以看看this link

另外,一个有趣的摘录:

注意:警告不是标准的一部分,因此您的编译器可能会或 可能不会给出上述警告。

【讨论】:

  • 这真的超载吗?我以为A::work()B::work() 在不同的范围内。
  • @KerrekSB 对。我再次浏览那篇文章,意识到我错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2012-02-04
  • 2011-11-28
相关资源
最近更新 更多