@H_301_1@我是C新手,我有很多关于OO语言的经验,如C/C++#/ Objective-C.现在我正在学习C.
我看到这个C代码:
class World : public State { };
看来,世界继续公开上课.
公共子类化?很难理解
这个功能的概念是什么?
这是有用还是需要的?
解决方法
对于关键字类定义的类,只需要使用public关键字,默认访问修饰符(对于所有的数据成员,成员函数和基类)都是私有的.所以
class World : State {};
是相同的:
class World : private State {};
这可能不是你想要的 – 这意味着基础类只能在类世界中访问.外界“不知道”,遗产就在那里.
对于使用关键字struct定义的类,默认访问修饰符为public,因此可以写:
struct World : State {};
并获得两者的外观和行为有点像所有其他语言与继承.但是struct关键字和它定义一个类的事实真的只是与C的兼容性.你不会找到很多C风格的指南,推荐使用它,以获得默认的公共可访问性 – 一般只用于对于POD课程,或者只适用于没有成员函数的课程.
至于为什么C首先有私有继承:对于大多数目的,私有继承是一种组合形式.正常组成:
class World { State state; public: void foo() { state.bar(); state.baz(); and so on } };
也就是说,世界知识分子是使用一个国家实现的,外界不知道世界是如何实现的.
与
class World : private State { public: void foo() { bar(); baz(); and so on } };
也就是说,世界知道这是一个国家实行的,外界不知道如何实施.但是您可以选择性地暴露State的接口部分,例如使用State :: bar;在公共部分的世界定义.效果就好像你在世界上辛苦地编写了一个函数(或几个重载),每个函数都在State上同一个函数.
除了避免打字之外,私人继承的一个常见用法是当类状态为空时,即没有数据成员.那么如果它是世界的成员,它必须占据一定的空间(不可否认,取决于对象布局,这可能是空格,否则就是填充,所以它不一定会增加世界的大小),但如果它是一个基类那么一个叫做“空基类优化”的东西就开始了,它可以是零大小.如果你创建了很多对象,这可能很重要.私有继承能够进行优化,但外部世界不会推断出一个“is-a”关系,因为它没有看到继承.
这是一个很好的区别 – 如果有疑问只是使用明确的组合.介绍继承来保存打字是非常好的,直到它有一些意想不到的后果.