在子类中看不到重载的方法

时间:2011-04-12 13:50:41

标签: c++ inheritance

  

可能重复:
  C++ overload resolution
  Why does an overridden function in the derived class hide other overloads of the base class?

为什么以下示例:

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)' test.cpp:8:注意:候选者是:void B :: f(float,int)

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

修改

我明白这是隐藏的。我问为什么会发生这种情况?

4 个答案:

答案 0 :(得分:7)

基本上,你没有重载基类方法;通过重新定义方法f,您隐藏基类方法。您可以通过将其明确地包含在子类范围中来防止这种情况:

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

答案 1 :(得分:3)

通过在B类中声明另一个名为'f'的函数,你隐藏了在A中声明的'f'。

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

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

这是因为编译器在B类的范围内查找并且只找到一个必须考虑重载解析的方法。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

派生类中定义的

void f(float a, int b){ }会在基类中隐藏void f(int x){ }

为什么?

阅读this回答。

解决方案

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