【问题标题】:Reading / Writing to padding in c++ [closed]在 C++ 中读取/写入填充 [关闭]
【发布时间】:2022-01-17 01:06:33
【问题描述】:

有没有办法写入或至少从编译器添加到 c++ 结构的填充中读取,例如我的编译器将 3 个字节的填充添加到以下结构

struct A {
      char a;
      int b;
};

【问题讨论】:

  • 因为派生类无法访问基类的私有成员。这是我认为的目的之一。
  • @KenZa 派生构造函数的职责是初始化它添加的自身部分。 Derive 拥有但Base 没有的那些成员。初始化 Base 部分不是它的责任,已经存在一个构造函数。派生类的实现者不需要知道甚至可以访问Base 的实现细节,派生的构造函数甚至可能无法执行Base 类所需的初始化。通过始终首先调用 Base 构造函数,您始终会得到最正确的结果。
  • @KenZa 是的。您可以选择base 中的任何构造函数。 example
  • @KenZa 至少会使用 base 中的一个构造函数,是的。不调用任何构造函数有什么目的?只需创建一个不执行任何操作的默认构造函数(隐式或显式),然后您就会拥有该行为。它仍然会被“调用”(概念上),但它什么也不做(除非你有成员变量的默认值)。
  • @KenZa 只要基类有一个构造函数接受你想要的值,没问题:example

标签: c++ padding


【解决方案1】:

首先,您的第一个陈述实际上并不正确。它仅适用于:

  1. 你的基类一个默认构造函数。

  2. 您没有在派生类的定义中指定要调用哪个基类构造函数,例如,您可以这样做:

Derived::Derived (int x) : Base (x) { }

至于为什么,嗯,这是哪个类负责什么的问题。所以:

  • 基类负责初始化它自己,并且只负责初始化它自己

  • 派生类也是如此

  • 派生类负责调用任何一个基类构造函数,以便正确初始化,编译器默认会这样做

简而言之,这都是常识,真的。当然,没有其他方法也行得通。

【讨论】:

  • 每个类默认都有一个构造函数,我没有指定从基类调用哪个构造函数,因为这是我想要的,我没有指定任何东西,如果你不指定,这就是 c++ 调用构造函数的方式无论如何,我的问题都很好
  • 这也不是真的。如果您定义用户定义的构造函数,则默认构造函数将被隐式删除,请参阅:en.cppreference.com/w/cpp/language/default_constructor。您可以覆盖此行为(例如,通过使用 = deleted 声明默认构造函数),但这是可选的。
  • 我知道...,在您的回答中,您说它仅适用于基类具有默认构造函数的情况,所以我说每个类默认都有一个构造函数(即使您没有定义一个),它将是被调用的那个
  • 嗯。是什么让你忽略了我之前评论中的信息?
  • 我不明白。我到底忽略了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多