c++ - 额外的继承对对象结构或实例化有什么影响吗?

标签 c++ inheritance object-layout

代码中有一些特殊类,也有一些普通类。我想区分它们,因为需要对特殊类进行不同的处理。所有这些特殊类都是基类(不是任何其他类的子类)

为了实现这一点,我正在标记特殊 class es 在源代码中插入一个空的 struct 继承给它们:

struct _special {};  // empty class
class A : public _special {  // A becomes special
...
};
class B {  // 'B' remains normal
...
};
class D : public A {  // 'D' becomes special due to 'A'
...
};

只要需要,我可以使用 is_base_of<Base,Derived> 找到隔离的特殊类和普通类.另一种方法是使用 typedef在特殊类(class)中:

class A {
  public: typedef something _special;
};

问题是如果 A 's child are inheritance from multiple classes 那么就会有歧义typedef

问题:添加这样的接口(interface)就像继承空class _special ,它会以任何方式伤害当前代码吗(例如对象结构化、编译错误等)?

最佳答案

对象在内存中的布局在 C++ 标准中仅部分指定,但大多数编译器都使用某些约定。空类型会占用一点内存(这样它们就会有一个内存地址来给出它们的指针标识)。这个额外的内存位通常只有四个字节,对于大多数用途来说无需担心。另一方面,如果您从空类型继承,则不应增加对象的大小,因为对象的其余部分将占用空间,因此无论如何它都会有一个地址。

如果您使用的是单继承对象,则将像第一个基类一样布局内存的第一位,然后是用于保存链中后续类成员的内存。如果你有任何虚函数,那么也可能在开头有一个地方用于放置虚指针。如果要从一种类型派生出另一种类型,通常需要遵循“三原则”:虚拟析构函数、复制构造函数和复制赋值运算符。那么你将有一个虚拟指针,同样这可能是 4 个字节,没什么大不了的。

如果你进入多重继承,那么你的对象在结构上开始变得非常复杂。它们将具有指向自身不同部分的各种指针,以便函数可以找到它们正在寻找的成员。

也就是说,请考虑您是否要使用继承来对其进行建模。或许给对象一个 bool 成员变量是个好主意。

关于c++ - 额外的继承对对象结构或实例化有什么影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7702214/

相关文章:

c++ - Boost R-tree 是否支持层级遍历?

c++ - 为什么在c++中实现基于类的优先级队列时需要重载operator<?

c++ - 继承——实例化问题

c++ - C++中嵌套类和多重继承之间的内存布局区别?

c++ - 成员函数的附加语法/说明符如何影响类中的内存布局?

c++ - C++中指向数据成员的指针的值

c++ - 使用 D3D11_MAPPED_SUBRESOURCE 和映射/取消映射时出现困惑的纹理输出

c++ - 编写接受代码输入的键盘驱动程序

python - 间接创建对象时如何子类化

c# - 继承泛型类