【问题标题】:Default class inheritance access默认类继承访问
【发布时间】:2011-04-18 04:57:50
【问题描述】:

假设我有一个基类和派生类:

class Base
{
    public:
    virtual void Do();
}

class Derived:Base
{
    public:
    virtual void Do();
}

int main()
{
    Derived sth;
    sth.Do(); // calls Derived::Do OK
    sth.Base::Do(); // ERROR; not calls Based::Do 
}

如我所见,我希望通过 Derived 访问 Base::Do。但是当我将 Derive 声明为

class Derived: public Base

一切正常。

我已经阅读了默认继承访问是公共的,那为什么我需要在这里显式声明公共继承?

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    您可能阅读了一些不完整或具有误导性的内容。引用 Bjarne Stroustrup 中的“C++ 编程语言”,第四版,第 10 页。 602:

    class 中,成员默认为private;在struct,成员 默认为public (§16.2.4)。

    这也适用于没有访问级别说明符的继承成员。

    一个普遍的约定是,只使用结构来组织纯数据成员。您正确地使用了class 来建模和实现对象行为。

    【讨论】:

    • @Prasoon 断章取义你是对的,但是标题和代码建立的上下文显然是“类”而不是“结构”。
    【解决方案2】:

    C++ 中class 的默认继承级别(在没有基类的访问说明符的情况下)是私有的。 [struct是公开的]

    class Derived:Base

    Base 是私有继承的,因此您不能在 main() 内部执行 sth.Base::Do();,因为 Base::Do()Derived 内部是私有的

    【讨论】:

      【解决方案3】:

      来自标准文档,11.2.2

      在基类没有访问说明符的情况下,当派生类使用 class-key structprivate 在使用 class-key class 定义类时假定

      因此,对于structs,默认值为public,对于classes,默认值为private...

      标准文档本身的示例,

      class D3 : B { / ... / }; // B private by default

      struct D6 : B { / ... / }; // B public by default

      【讨论】:

      • 这应该是答案。
      【解决方案4】:

      继承的默认类型是私有的。 在您的代码中,

      B类:A

      不过是

      B 类:私有 A

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 2021-06-10
        • 2018-10-16
        • 1970-01-01
        • 2017-05-05
        • 2017-09-05
        • 2013-01-25
        相关资源
        最近更新 更多