基类中的f(int)是否在派生的派生类D中继承了f(double)?

时间:2011-09-22 17:35:37

标签: c++

  

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

基类中的f(int)是否在派生的派生类D中继承? 如果是,那么为什么超载在这里不起作用。 如果没有那么为什么f(int)不被继承,因为类d是公开派生的。 我很困惑。

    class B {
    public:
        int f(int i) { cout << "f(int): "; return i+1; }
        // ...
    };

    class D : public B {
    public:
        double f(double d) { cout << "f(double): "; return d+1.3; }
        // ...
    };

    int main()
    {
        D* pd = new D;

        cout << pd->f(2) << '\n';
        cout << pd->f(2.3) << '\n';
    }

2 个答案:

答案 0 :(得分:6)

这是隐藏功能的经典示例 C ++中的重载决策不适用于各种类,派生类中的函数隐藏 所有 Base类中具有相同名称的函数。编译器只在派生类中查看派生类对象的函数。

您可以在derive类中使用使用声明。 取消隐藏 所有派生类的基类函数。

添加,

using B::f;
派生类中的

将使派生类对象能够访问Base类中名为f()的所有函数,就好像它们是派生类中的重载函数一样。


这应该是一个很好的阅读:

<强> What's the meaning of, Warning: Derived::f(char) hides Base::f(double)?

答案 1 :(得分:4)

我认为如果给派生类一个与基类中存在的函数同名的函数,派生类'函数将隐藏基类的函数。如果您只想过载,请使用using关键字。

class B {
public:
    int f(int i) { cout << "f(int): "; return i+1; }
    // ...
};

class D : public B {
public:
    using B::f; //brings in all of B's "f" functions
                //making them equals of D's "f" functions.
    double f(double d) { cout << "f(double): "; return d+1.3; }
    // ...
};

int main()
{
    D* pd = new D;

    cout << pd->f(2) << '\n';
    cout << pd->f(2.3) << '\n';
}