微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C子类访问修饰符?

我是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”关系,因为它没有看到继承.

这是一个很好的区别 – 如果有疑问只是使用明确的组合.介绍继承来保存打字是非常好的,直到它有一些意想不到的后果.

原文地址:https://www.jb51.cc/c/112094.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐