祖父母在孩子身上重载了功能

时间:2013-02-17 23:48:25

标签: c++ overloading override

我需要理解为什么如果在Parent中声明任何重载函数,C ++不允许访问Child中的祖父素重载函数。请考虑以下示例:

class grandparent{
public:
    void foo();
    void foo(int);
    void test();
};

class parent : public grandparent{
public:
    void foo();
};

class child : public parent{
public:
    child(){
        //foo(1); //not accessible
        test();   //accessible
    }
};

这里,两个函数foo()和foo(int)是Grandparent中的重载函数。但是foo(int)是不可访问的,因为foo()在Parent中声明(如果声明它是public或private或protected,则无关紧要)。但是,test()是可访问的,根据OOP是正确的。

我需要知道这种行为的原因。

2 个答案:

答案 0 :(得分:10)

原因是方法隐藏

在派生类中声明具有相同名称的方法时,将隐藏具有该名称的基类方法。完整签名无关紧要(即cv-qualifiers或参数列表)。

如果您明确要允许通话,则可以使用

using grandparent::foo;

parent内。

答案 1 :(得分:1)

想象一下,图书馆有这个类:

struct Base {
};

在您的代码中,您将该类用作基类:

struct Derived : Base {
    void f(int);
};

现在你写道:

Derived d;
d.f('a');

现在你得到了该库的闪亮的新版本2.0,并且基类已经改变了一点:

struct Base {
    void f(char);
}

如果在此处应用了重载,您的代码就会中断。