将方法添加到名为与继承方法相同的子类

时间:2016-05-23 11:16:11

标签: c++ inheritance overloading

我在类f()和子类A中有方法B,我在其中添加了方法f(int)。如果我理解的话,我在f()中同时拥有f(int)B。我想在f()的另一种方法中使用B,但这是一个错误。

class A {
public:
    int f() {
        return 3;
    }
};

class B : public A {
    int x;
public:
    int f(int a) {
        return a * 2;
    }
    void g() {
        x = f();
       // no matching function for call to 'B::f()'
       // candidate is 'int B::f(int)'
    }
};

如果我从f(int)移除B,则可以使用。

2 个答案:

答案 0 :(得分:5)

  

如果我理解的话,我f() f(int)B都有。{/ p>

不,A::f()隐藏在B的范围内。因为可以在类f的范围内找到名为B的成员函数,然后名称查找将停止,所以找不到基类版本f并考虑超载分辨率。最后编译失败,因为函数参数不匹配。这是一种隐藏的名字。

您可以通过A::f介绍using

class B : public A {
    int x;
public:
    using A::f;
    int f(int a) {
        return a * 2;
    }
    void g() {
        x = f();
    }
};
  

如果我从f(int)移除B,则可以使用。

然后名称查找在类B的范围内失败,将检查更多的范围,并在基类A::f的范围内找到A,然后它运行良好

请参阅Unqualified name lookup

答案 1 :(得分:1)

您可以使用范围解析运算符::

x = f();替换为x = A::f();

class A {
public:
    int f() {
        return 3;
    }
};

class B : public A {
    int x;
public:
    int f(int a) {
        return a * 2;
    }
    void g() {
        x = A::f();
    }
};