4

如果我有两个类,一个从另一个继承,而子类只包含函数,那么两个类的内存布局是否相同?

例如

class Base {
  int a,b,c;
};

class Derived: public Base {
  // only functions.
};

我读过编译器不能重新排序数据成员,我不需要Derived类的多重继承。有没有内存布局不一样的情况?(类可能需要多重继承Base

4

5 回答 5

3

两者BaseDerived这里都是标准布局类。由于标准布局旨在与其他语言(尤其是 C)进行互操作,是的,您可以期望两者的布局相同。但是,如果您将多重继承添加到混合中,则结果可能是也可能不是标准布局类。您可以在上面链接的帖子中查看规则。

于 2012-07-09T22:40:39.113 回答
1

布局必须相同,因为您可以通过指向基类的指针访问派生实例。

这意味着即使您添加了数据成员,它们仍然是相同的。

这也意味着即使您使用了多重继承,它也是一样的。
(尽管在这种情况下,您可能需要专门做static_casts 来指定您所指的基类的哪个实例,因为派生类指针不必与基类指针相同。)

于 2012-07-09T22:40:19.720 回答
1

它因编译器而异,但我认为对于最常见的编译器,您的假设是正确的。g++/gcc 按照您的建议进行某些工作,但我不确定其他工作。

于 2012-07-09T22:40:39.913 回答
1

实际上,两个类的布局是相同的,但请注意,如果您将任何虚函数添加到派生类型,那么布局将会改变(或至少可以改变)。

现在,从描述看来,您尝试做的是创建一个类型以在现有类之上提供成员函数,如果是这种情况,您可能应该考虑其他不同的设计,例如使用自由函数(C风格)。

于 2012-07-10T02:41:24.167 回答
0

不要指望它。

但是对于一些常见的编译器,内存布局实际上可能是相同的。

于 2012-07-09T22:38:49.813 回答