通常的方法上的Woverloaded-virtual警告

Mik*_*ola 4 c++ oop

我很困惑为什么以下代码产生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,没有参数 - 签名与基类的类似虚方法不同.那为什么编译器无法解决这种情况呢?

Sto*_*ica 5

警告的原因是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符来代替它.