1

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

  • struct 的成员默认是 public 的;类的成员 默认是私有的struct 的成员默认是 public 的原因是为了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 { };

这里 B 是 D2、D4 和 D6 的公共基础,D1、D3 和 D5 的私有基础,以及 D7 和 D8 的受保护基础。


编辑

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

4

2 回答 2

7

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

于 2010-12-13T09:16:05.227 回答
1

考虑到 struct 和 class 的默认访问权限不同,这难道没有意义吗?(如您的第一个要点)

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

我错过了你的问题吗?

于 2010-12-13T09:17:43.460 回答