C++子类化访问修饰符?

Eon*_*nil 13 c++ inheritance access-modifiers subclassing

我是C++新手,我有很多关于OO语言的经验,比如C/C#/ Objective-C.现在,我正在学习C++.

我看到了这个C++代码:

    class World : public State
    {
    };
Run Code Online (Sandbox Code Playgroud)

似乎WorldState公开继承了这个类.公共子类化?这很难理解.

这个功能的概念是什么?什么时候有用或需要?

Ste*_*sop 17

public关键字的需求只是对于使用关键字定义的类class,默认访问修饰符(对于所有内容 - 数据成员,成员函数和基类)private.所以

class World : State {};
Run Code Online (Sandbox Code Playgroud)

是相同的:

class World : private State {};
Run Code Online (Sandbox Code Playgroud)

这可能不是你想要的 - 这意味着基类只能在类中访问World.局外人"不知道"继承存在于那里.

对于使用关键字定义的类struct,默认访问修饰符是public,因此您可以编写:

struct World : State {};
Run Code Online (Sandbox Code Playgroud)

并获得看起来和行为有点像所有其他语言继承的东西.但是struct关键字,以及它定义一个类的事实,实际上只是与C的兼容性.你不会发现许多C++样式指南建议使用它只是为了获得默认的公共可访问性 - 通常它只用于类是POD,或者可能只适用于没有成员函数的类.

至于为什么C++首先具有私有继承:对于大多数目的,私有继承是一种组合形式.正常成分:

class World {
    State state;
  public:
    void foo() {
        state.bar();
        state.baz();
        and so on
    }
};
Run Code Online (Sandbox Code Playgroud)

也就是说,班级世界知道它是使用国家实施的,而外界并不知道世界是如何实施的.

class World : private State {
  public:
    void foo() {
        bar();
        baz();
        and so on
    }
};
Run Code Online (Sandbox Code Playgroud)

也就是说,世界一流知道它是作为一个国家实施的,而外界并不知道它是如何实施的.但是你可以选择性地公开State接口的部分内容,例如放入using State::bar;World定义的公共部分.效果就好像你在World中费力地编写了一个函数(或几个重载函数),每个函数都在State上代表同一个函数.

但是,除了避免键入之外,私有继承的一个常见用途是当类State为空时,即没有数据成员.然后如果它是它的成员World必须占用一些空间(诚然,根据对象布局,这可能是空间,否则只是填充,所以它不一定增加大小World),但如果它是一个基类然后被称为"空基类优化"的东西开始了,它可以是零大小.如果你要创建很多对象,这可能很重要.私有继承支持优化,但外部世界不会推断出"is-a"关系,因为它没有看到继承.

这是一个非常好的差异 - 如果有疑问,只需使用明确的组合.引入继承以节省输入是非常好的,直到它有一些意想不到的后果.


det*_*zed 6

如果

class World: private State
{
};
Run Code Online (Sandbox Code Playgroud)

私有继承意味着所有public和 的protected成员State将被 继承World并成为private。这封印State在里面World。任何继承自的类World都不能访问State.