C ++中的多态性为什么这不起作用?

时间:2017-01-09 08:23:56

标签: c++ polymorphism

class Base {
    public:
    virtual void f();
    void f(int);
    virtual ~Base();
};

class Derived : public Base {
public:
    void f();
};

int main()
{
    Derived *ptr = new Derived;
    ptr->f(1);
    delete ptr;
    return 0;
}

ptr-> F(1);显示以下错误:“函数调用中的参数太多。”

为什么这不可能?是不是派生继承了所有的函数形式基础并可以自由使用它们中的任何一个? 我可以明确地调用它,它会起作用,但为什么不允许这样做?

4 个答案:

答案 0 :(得分:11)

您所看到的内容称为隐藏

当您覆盖void f()类中的函数Derived时,您隐藏 f类中Base函数的所有其他变体

您可以使用using关键字解决此问题:

class Derived : public Base {
public:
    using Base::f;  // Pull all `f` symbols from the base class into the scope of this class

    void f() override;  // Override the non-argument version
};

答案 1 :(得分:1)

正如@Some Programming Dude所说:这是因为隐藏。

了解隐藏在相对简单的语言

Inheritance旨在将Base类变量/函数带入Derived类。

但是,在1条件下:“如果它尚未在Derived Class中可用”

由于f()Derived已经可用,因此从编译器角度看Base类是没有意义的。

这就是为什么在调用此函数时需要调整范围的确切原因

void main()
    {
        Derived *ptr = new Derived;
        ptr->Base::f(1);
        delete ptr;
    }

答案 2 :(得分:0)

假设暂时Derived可以访问函数void Base::f(int);。然后是function overloading的情况。但是,这是function overloading的无效情况,因为一个函数f(int);在Base中,而其他函数f();在Derived中。 Function Overloading发生在一个类中。 Function Overriding跨类发生。您发布的示例是Name Hiding in Inheritance

的案例

答案 3 :(得分:-1)

" Derived * ptr"这个定义只允许" ptr"访问通过Derived类或其子类定义的所有成员函数。但是,由于继承,它不允许你访问Derived类中的成员函数。

如果你想访问函数的基类版本" f"然后使用" Base * ptr"它将自动选择正确的功能版本,如下所示:)

class Base {
    public:
        virtual void f()
        {
            cout<<"Here 2"<<endl;
        }
        void f(int x)
        {
            cout<<"Here 1"<<endl;
        }
        virtual    ~Base() {}
};

class Derived : public Base {
    public:
        void f()
        {
            cout<<"Here 3"<<endl;
        }
        virtual   ~Derived() {}
};

int main()
{
    Base *ptr = new Derived;
    ptr->f(1);
    delete ptr;
    return 0;
}

输出是 这里1