【问题标题】:How to get rid of C++Builder Warning "virtual function hides..."如何摆脱 C++Builder 警告“虚拟函数隐藏...”
【发布时间】:2013-08-19 10:05:22
【问题描述】:

考虑以下代码示例:

struct Base {
  virtual void foo(int) {}
  virtual void foo(int, double) {}

};

struct Derived : Base {
  virtual void foo(int) {}
};

在 Embarcadero RAD Studio 2010 (C++Builder 2010) 中,这会给出(正确的)警告,告诉我们 Base::foo(int,double)Derived::foo(int) 隐藏。 (同样的警告由 gcc 的-Woverloaded-virtual 触发)通常要做的事情是使用指令:

struct Derived : Base {
  virtual void foo(int) {}
  using Base::foo;
};

这会按预期消除 gcc 中的警告,但对 C++Builder 没有帮助,尽管它使编译器可以看到基类函数:

Derived d;
d.foo(2,3.4);

使用 using 指令编译就好了。

除了使用#pragma warn 或重新定义函数à la 之外,是否有任何已知的解决方法可以消除 C++Builder 中的警告

struct Derived : Base {
  virtual void foo(int) {}
  virtual void foo(int i, doubld d) {Base::foo(i,d); }
};

【问题讨论】:

  • 无论在此处找到任何解决方法,您都应该对此提交错误。
  • 不值得花时间。我发现了有关 Borland/Embarcadero 5 年多以来无人看管的不正确警告的其他错误。我应该做的是摆脱我用过的最糟糕的编译器/IDE。可悲的是,事情没那么简单。
  • @ArneMertz 我也是这种情况,你得到了我的同情。
  • 在基类中将方法定义为纯虚拟应该消除警告。

标签: c++ c++builder


【解决方案1】:

在派生类中声明所有形式的方法/函数会删除警告。

struct Derived : Base {
  virtual void foo(int, double) {}
  virtual void foo(int) {}
};

【讨论】:

  • 这会改变行为,因为你的覆盖什么都不做。问题已经表明他们知道这个选项,但更喜欢更好的方法。
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多