【问题标题】:Rationale for difference in "default" access-specifier for a base class基类的“默认”访问说明符差异的基本原理
【发布时间】:2010-12-13 09:10:51
【问题描述】:

我知道在 C++ 中 structclass 之间几乎没有区别。我也理解少数差异的原因。像这个,

  • 结构的成员是 公开的 默认;班级成员是 默认为私有。 struct 的成员之所以默认为public,是为了让C++-structC-struct 兼容。而类成员之所以默认是私有的,是为了引入数据封装的概念(即执行面向对象的原则/技术/等)。

我不明白的是,引用标准 $11.2/2 [class.access.base]

在没有访问说明符的情况下 一个基类,当 派生类声明为 struct 和 private 假定当类 被声明为类。

这种扭曲和反统一的原因是什么? 为什么需要这种差异?

标准中的示例,

class B {  };
class D1 : private B {  };
class D2 : public B { };
class D3 : B { };         //B private by default
struct D4 : public B { };
struct D5 : private B { };
struct D6 : B { };        //B public by default
class D7 : protected B { };
struct D8 : protected B { };

这里 B 是 D2、D4 和 D6,D1、D3 和 D5 的私人基地, 以及 D7 和 D8 的受保护碱基。


编辑

你们中的一些人可能会说,考虑到结构和类的默认访问权限不同(上面的要点中给出的差异),这种差异是有意义的。但我认为,inherited-structC-struct (不支持继承)完全不兼容,无论你如何派生它。不过我可能是错的。这就是为什么我正在寻求好的解释,可能还有例子! :-)

【问题讨论】:

    标签: c++ inheritance language-lawyer access-specifier


    【解决方案1】:

    我不确定您为什么认为这是一个转折,您与成员子对象和基类子对象保持一致。对于用struct 声明的类,它们都是公共的,而对于用class 声明的类,它们都是私有的。简单易记。

    【讨论】:

    • @Charles :正如您所说,重点不在于它“简单易记”。我正在寻求对这种差异的解释,而不是你所说的。
    • @Nawaz:有什么区别?如果class 继承默认是public 并且成员访问private 那么你会有一个需要证明的差异。由于规则是更简单的选择,因此实际上不需要任何进一步的理由。
    • +1,喜欢这个推理 :) 另请注意,它会给注入的类名提供一致性。如果继承不是公开的,那么给定struct A : SomeStruct { }; 执行A::SomeStruct 将无法在类外访问。
    • @Nawaz:关键是基类可以看作是类的一个特殊的隐式成员。所以默认情况下两者都是公共的意味着结构总是一个开放的数据类。
    • @stefaanv 和@Charles:我想,我现在明白了。 stefaanv 的评论让我从不同的角度思考。现在对我来说似乎很明显:D。接受。
    【解决方案2】:

    考虑到结构和类的默认访问权限不同,这是否有意义? (如您的第一个要点)

    如果你从一个结构(默认是公共的)继承,那么没有指定访问修饰符,你暗示公共继承,而如果你从一个类(默认是私有)继承,那么没有指定访问修饰符,你意味着私有继承。

    我在你的问题中遗漏了什么吗?

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 2011-06-15
      • 2016-01-15
      • 2015-10-14
      • 2012-04-09
      • 1970-01-01
      • 2014-03-28
      • 2012-02-03
      • 2016-08-14
      相关资源
      最近更新 更多