【问题标题】:C++ - Is it possible to use class inheritance without the member initialization list (MIL)?C++ - 是否可以在没有成员初始化列表 (MIL) 的情况下使用类继承?
【发布时间】:2022-01-15 16:27:49
【问题描述】:

我刚刚了解了 C++ 中的类。我知道可以使用成员初始化列表语法(MIL)来初始化数据成员,但是我认为使用起来不是很直观,而且我认为这是一种非常丑陋的数据成员分配方式。

显然,C++ 中的类继承必须通过这种 MIL 语法来完成。我不明白这背后的理由,谷歌搜索没有给我答案。我也找不到该规则的任何反例。我在网上看到的每个关于继承的例子都需要 MIL。

所以我的问题是:是否可以在没有 MIL 的情况下设置继承?

如果答案是肯定的,请说明如何。 如果答案是否定的,请解释为什么不这样做。 (给出强制 MIL 继承的理由)

【问题讨论】:

  • 这取决于...如果您的所有类都可以聚合或列表初始化,您可以完全省略构造函数。但是,如果您需要在层次结构中的某处提供构造函数,则必须使用初始化列表。丑吗?口味问题!这是一个清晰的概念,很好。
  • 你能详细说明一下在某处提供构造函数吗?
  • 在层次结构中的某处意味着:如果你有类 A、B 和 C 并且 A 继承 B 等等,其中一个有构造函数,你不能再使用列表或聚合初始化.
  • 顺便说一句:不要等待解释,只需尝试一下。你的编译器是找出什么是允许的,什么是不允许的最好的朋友。并非所有编译的东西都是正确的,但作为初学者,尝试阅读的内容会很有趣。带上你的初学者书,让我们走吧!
  • 有什么例子吗?我不知道什么是聚合。另外,什么是提供构造函数?

标签: c++ inheritance initializer-list


【解决方案1】:

不,这通常是不可能的。如果基类具有默认构造函数,则可以在适当的情况下在派生类的构造函数中省略其初始值设定项。不过,通常情况下,您会想要调用特定的构造函数,而成员初始化器列表就是这样做的地方。

原因在于语言的设计:一个类的所有“直接子对象”,即它引入的基类对象和非静态数据成员,实际上甚至在其构造函数的主体进入之前就已初始化。必须为无法默认初始化的子对象提供显式成员初始化器,否则程序格式错误(必须被编译器拒绝)。如需进一步参考,请参阅 constructors and member initializer lists 上的例如 cppreference。

实际上,这意味着,虽然构造函数可以在初始化后执行额外的工作,但具有空主体的构造函数在 C++ 中相当普遍,但具有空成员初始化列表的构造函数则不然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多