c++ 为什么虚拟函数被隐藏?

我有以下类:

class A {
public:
    virtual void f() {}
};


class B : public A{
public:
    void f(int x) {}
};

如果我说

B *b = new B();
b->f();

编译器说错误C2660:’B :: f’:函数不带0个参数。
B中的函数不应该重载,因为它是一个虚函数?虚拟函数是否像这样隐藏?

编辑:我的意思是从A继承B,表现出同样的行为。

假设你打算B从A派生:

f(int)和f()是不同的签名,因此不同的功能。

您可以使用具有兼容签名的函数来覆盖虚函数,这意味着相同的签名,或者返回类型是“更具体的”(这是协方差)的签名。

否则,派生类函数隐藏虚函数,就像派生类声明与基类函数名称相同的函数的任何其他情况一样。你可以使用A :: f;在B类中取消隐藏名称

或者,您可以将其称为(static_cast< A *>(b)) – > f();或作为b-> A :: f();.不同的是,如果B实际上覆盖了f(),那么前者调用override,而后者调用A中的函数。

http://stackoverflow.com/questions/4146499/why-does-a-virtual-function-get-hidden

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c++ 为什么虚拟函数被隐藏?