我很困惑为什么以下代码会产生 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/

10-11 16:30