为什么隐藏虚拟功能?

Osz*_*kar 22 c++ virtual hide

我有以下课程:

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


class B : public A{
public:
    void f(int x) {}
};
Run Code Online (Sandbox Code Playgroud)

如果我说

B *b = new B();
b->f();
Run Code Online (Sandbox Code Playgroud)

编译器说错误C2660:'B :: f':函数不带0个参数.不应该B中的函数超载它,因为它是一个虚函数?虚拟函数会像这样被隐藏吗?

编辑:我的确意味着从A继承B,它显示了相同的行为.

Ste*_*sop 37

假设您打算B派生自A:

f(int)并且f()是不同的签名,因此具有不同的功能.

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

否则,派生类函数会隐藏虚函数,就像派生类声明与基类函数同名的函数一样.您可以using A::f;在B类中取消隐藏名称

或者你可以把它称为(static_cast<A*>(b))->f();或作为b->A::f();.区别在于,如果B实际上覆盖了f(),那么前者调用覆盖,而后者则调用函数A.


Rod*_*Rod 7

B类不是从A派生的,因此不存在函数F().你可能意味着:

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


class B : public A {
public:
    void f(int x) {}
};
Run Code Online (Sandbox Code Playgroud)

编辑:我错过了隐藏的实际功能.请参阅Steve Jessop的答案以获得更详尽的解释.