我很困惑为什么以下代码会产生Woverloaded-virtual警告。
class TestVirtual
{
public:
TestVirtual();
virtual void TestMethod(int i);
};
class DerivedTestVirtual : public TestVirtual
{
public:
void TestMethod();
};
派生类具有通常的方法TestMethod,没有参数 - 签名与基类的类似虚方法不同。那为什么编译器无法解决这种情况呢?
答案 0 :(得分:5)
警告的原因是no参数版本隐藏了基类的int
版本。
DerivedTestVirtual tdv;
tdv.TestMethod(0); // This line will cause an error.
你可以通过声明你使用基数的所有原始重载来规避这一点,如下所示:
class DerivedTestVirtual : public TestVirtual
{
public:
using TestVirtual::TestMethod;
void TestMethod();
};
警告会引起您的注意。它也很有用,因为当你试图覆盖它时会发生这样的错误,但是意外地会导致超载。虽然现在你使用override
说明符来代替它。