无法使用基类方法

时间:2012-07-14 00:22:46

标签: c++ class inheritance methods

  

可能重复:
  overloaded functions are hidden in derived class

如果它们在C ++中的基类和派生类中都被重载,我似乎无法直接使用派生类中的基类的方法。以下代码生成错误no matching function for call to ‘Derived::getTwo()’

class Base {
public:
    int getTwo() {
        return 2;
    }
    int getTwo(int, int) {
        return 2;
    }
};

class Derived : public Base {
public:
    int getValue() {
        // no matching function for call to ‘Derived::getTwo()’
        return getTwo();
    }
    int getTwo(int) {
        return 2;
    }
};

如果我将return getTwo();更改为return ((Base*) this)->getTwo(),它会起作用,但这看起来很难看。我该如何解决这个问题?

P.S。如果重要的话,我使用g ++ 4.7和std = gnu ++ c11选项。

2 个答案:

答案 0 :(得分:1)

或者:

class Derived : public Base {
public:
    using Base::getTwo; // Add this line
    int getValue() {
        // no matching function for call to ‘Derived::getTwo()’
        return getTwo();
    }
    int getTwo(int) {
        return 2;
    }
}

或者

        return Base::getTwo();

答案 1 :(得分:0)

这就是C ++中名称查找的工作原理:

namespace N1
{
    int getTwo();
    int getTwo(int, int);

    namespace N2
    {
        int getTwo(int);

        namespace N3
        {
            call getTwo(something char*);
        }
    }
}

目前的背景是N3。此图层上没有getTwo。好的,转到上层。 N2包含getTwo的一个定义。编译器将尝试使用此定义,而不会搜索上层上下文。来自N2的getTwo隐藏了所有上层的getTwo的所有定义。有时这会导致与重载方法混淆。

如果添加using Base::getTwo;,实际上是在内部上下文中添加定义代理。上层语境temsellves的定义不可见。但代理是可见的。