基类的"默认"访问说明符的差异的基本原理

Naw*_*waz 1 c++ inheritance access-specifier language-lawyer

我知道C++ 之间structclassC++ 之间的差异很小.我也理解几个差异的原因.像这个,

  • struct的成员默认公共的 ; 默认情况下,类的成员是 私有的.struct的成员默认公开的原因是为了C++-struct兼容C-struct.并且默认情况下,类成员是私有的原因是引入数据封装的概念(即强制执行面向对象的原则/技术/等).

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

如果没有基类的访问说明符,则在派生类声明为struct时假定为public,并在声明类时声明为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 { };
Run Code Online (Sandbox Code Playgroud)

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


编辑

你们有些人可能会说,这种差异是有道理的,因为struct和class的默认访问权限是不同的(上面的项目符号中给出的差异).但我认为,无论你如何得出它,inherited-struct总是与C-struct(不支持继承)不相容.我可能错了.这就是我寻求好的解释的原因,可能还有例子!:-)

CB *_*ley 7

我不确定为什么你认为这是一个扭曲,你与成员子对象和基类子对象的一致性.它们对于声明的类是公共的,对于声明struct的类是私有的class.简单易记.