【问题标题】:Can't call base class's method when another overload present in derived class当派生类中存在另一个重载时无法调用基类的方法
【发布时间】:2021-06-03 11:14:50
【问题描述】:

编译以下代码时出现编译器错误“函数不接受 0 个参数”。

class A
{
public:
    int Foo()
    {
        return 1;
    }

protected:
    virtual void Foo(int& n)
    {
        n += 1;
    }
};

class B : public A
{
protected:
    // Override of A
    void Foo(int& n)
    {
        n += 2;
    }
};


int main(int argc, char* argv[])
{

    B b;
    int n = b.Foo();
    return n;
}

看起来编译器坚持调用重载 B::Foo(int&) 而不是 A::Foo()。我必须在这里遗漏一些明显的东西。任何解释编译器行为的 C++ 标准的指针都将不胜感激。

我确实意识到“int n = ((A)b).Foo();”会让编译器高兴,但这对我来说不是一个理想的解决方案。

谢谢。

【问题讨论】:

    标签: c++


    【解决方案1】:

    添加这一行:

    using A::Foo;
    

    B(公共部分)类中,它会起作用。

    在这种情况下,Foo 来自 B 隐藏 Foo 来自 A。 C++ 奇怪的行为之一。

    【讨论】:

    • 这确实很奇怪——或者至少不直观。谢谢。
    • @bdristan 这里的概念是来自不同命名空间的函数不会过载。如果你想让A::Foo() 成为B::Foo() 的重载,它也需要存在于B
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2013-05-18
    • 2014-09-05
    • 2021-09-02
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多