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