我很困惑为什么以下代码会产生 Woverloaded-virtual 警告。
class TestVirtual
{
public:
TestVirtual();
virtual void TestMethod(int i);
};
class DerivedTestVirtual : public TestVirtual
{
public:
void TestMethod();
};
派生类具有不带参数的常用方法 TestMethod - 签名与基类的类似虚拟方法不同。那为什么编译器不能解决这种情况呢?
最佳答案
警告的原因是无参数版本隐藏了基类中的 int
版本。
DerivedTestVirtual tdv;
tdv.TestMethod(0); // This line will cause an error.
您可以通过声明使用基础中的所有原始重载来规避这一点,如下所示:
class DerivedTestVirtual : public TestVirtual
{
public:
using TestVirtual::TestMethod;
void TestMethod();
};
警告是为了引起您的注意。它也很有用,因为当您尝试覆盖它时可能会发生这样的错误,但不小心最终导致重载。虽然现在你会使用
override
说明符来代替它。关于c++ - 对常用方法的 Woverloaded-virtual 警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46060018/