【问题标题】:Grandparent overloaded function in child [duplicate]孩子中的祖父母重载函数[重复]
【发布时间】:2023-04-08 07:45:01
【问题描述】:

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

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 中声明的(不管它声明的是公共的、私有的还是受保护的)。但是, test() 是可访问的,这根据 OOP 是正确的。

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

【问题讨论】:

    标签: c++ overloading overriding


    【解决方案1】:

    原因是方法隐藏

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

    如果你明确想要允许调用,你可以使用

    using grandparent::foo;
    

    parent内。

    【讨论】:

    • 这种行为是好事有什么原因吗? (即 why 是什么原因,而不是 why 是什么原因)
    • @SanjayManohar 我看到的唯一用途是防止错误 - 即认为您正在从父级调用方法并实际上从祖父级调用方法,因为您错过了输入参数。您可以使用 using 指令绕过它。
    【解决方案2】:

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

    struct Base {
    };
    

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

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

    现在你写:

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

    现在您获得了该库的闪亮新版本 2.0,并且基类发生了一些变化:

    struct Base {
        void f(char);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多