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)
似乎World类State公开继承了这个类.公共子类化?这很难理解.
这个功能的概念是什么?什么时候有用或需要?
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"关系,因为它没有看到继承.
这是一个非常好的差异 - 如果有疑问,只需使用明确的组合.引入继承以节省输入是非常好的,直到它有一些意想不到的后果.
如果
class World: private State
{
};
Run Code Online (Sandbox Code Playgroud)
私有继承意味着所有public和 的protected成员State将被 继承World并成为private。这封印State在里面World。任何继承自的类World都不能访问State.