基类“默认”访问说明符差异的基本原理
-
09-10-2019 - |
题
我知道两者之间几乎没有什么区别 struct
和 class
在C++中。我也了解一些差异的原因。像这个,
- 结构体的成员有 默认情况下公开;班级成员是默认为私有. 。struct 成员的原因是 默认公开, 是为了使
C++-struct
兼容于C-struct
. 。以及班级成员的原因 默认为私有, ,是要引入概念 数据封装 (即强制执行面向对象的原则/技术/等)。
我不明白的是,引用标准 $11.2/2 [class.access.base]
在没有用于基类的访问指示符的情况下,当声明派生类的结构并在该类声明类别时假定私人时,假定公共。
这种扭曲和反统一的理由是什么? 为什么需要这种差异?
标准中的示例,
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-struct
完全不兼容 C-struct
(不支持继承),无论您如何派生它。但我可能是错的。这就是为什么我正在寻求好的解释,可能还有例子!:-)
解决方案
我不知道为什么你认为这是一个扭曲,你与成员子对象和基类子对象保持一致。对于声明的类来说,它们都是公共的 struct
和私有的类声明 class
. 。简单易记。
其他提示
考虑到结构和类的默认访问权限不同,这是否有意义?(如你的第一个要点)
如果您从结构体(默认情况下为公共)继承,则在不指定访问修饰符的情况下,您暗示着公共继承,而如果您从类(默认情况下为私有)继承,则在不指定访问修饰符的情况下,您暗示着私有继承继承。
我在你的问题中遗漏了什么吗?
不隶属于 StackOverflow