C++ 在子类中未看到重载方法

C++ 在子类中未看到重载方法,c++,inheritance,C++,Inheritance,可能的重复项: 为什么会出现以下示例: class A { public: void f(int x){ } }; class B : public A { public: void f(float a, int b){ } }; int main(){ B *b = new B; b->f(1); }; 原因: test.cpp:在函数“int main()”中: test.cpp:13:错误:对“B::f(int

可能的重复项:

为什么会出现以下示例:

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

class B : public A {
    public:
        void f(float a, int b){ }
};

int main(){
    B *b = new B;
    b->f(1);
};
原因:

test.cpp:在函数“int main()”中: test.cpp:13:错误:对“B::f(int)”的调用没有匹配的函数 测试cpp:8:注:候选项为:void B::f(float,int)

f(int)
f(float,int)
具有不同的签名。为什么会导致错误

编辑


我知道它藏起来了。我问为什么会发生这种情况?

本质上,您没有重载基类方法;通过重新定义方法
f
,您隐藏了基类方法。您可以通过将其显式包含到子类作用域中来防止这种情况,方法如下:

class B : public A {
    public:
        using A::f;
        void f(float a, int b){ }
};
派生类中定义的
void f(float a,int b){}
隐藏基类中的
void f(int x){}

为什么?

阅读答案

解决方案

 using A::f; // add this above f's definition in the derived class

A::f被B:f隐藏。使用
使用
指令重载基类方法

class B : public A {
    public:
        using A::f;
        void f(float a, int b){ }
};

通过在类B中声明另一个名为“f”的函数,可以隐藏在类A中声明的“f”

要使重载与继承一起工作,请向类B添加一个using指令

class B : public A {
public:
    using A::f;
    void f(float a, int b){ }
};

这是因为编译器在类B的范围内,只找到一个必须考虑过载解决方案的方法。

为什么要隐藏它?这仅仅是一条规则,还是编译器有理由这样工作?@gruszczy这是一条规则。当基类后来发生更改并引入与派生类方法同名的新方法时,它确实有意义。这反过来又可能导致在客户机代码中旧方法被调用的地方调用新方法。从本质上说,这个规则确保了基类接口被扩展时代码的向后可维护性。我猜它是隐藏的,因为B::f和A:f在不同的范围内。