如果我有两个类,一个继承自另一个类,而子类只包含函数,那么两个类的内存布局是否相同?
e.g。
class Base {
int a,b,c;
};
class Derived: public Base {
// only functions.
};
我已经读过编译器无法重新排序数据成员,并且我不需要Derived
类上的多重继承。是否存在内存布局不一样的情况? (Base
类可能需要多重继承)
答案 0 :(得分:3)
这里Base
和Derived
are standard layout classes。由于标准布局旨在与其他语言(最值得注意的是C)进行互操作,是的,您可以预期两者的布局相同。但是,如果向混合中添加多重继承,则结果可能是也可能不是标准布局类。您可以在上面链接的帖子中查看相关规则。
答案 1 :(得分:1)
布局必须相同,因为您可以通过指向基类的指针访问派生实例。
即使您添加了数据成员,这意味着它们仍然是相同的。
这也意味着即使您使用了多重继承,它也会一样
(虽然在这种情况下,您可能需要专门执行static_cast
来指定您所引用的基类的哪个实例,因为派生类指针不需要与基类指针。)
答案 2 :(得分:1)
它使编译器与编译器不同,但我认为对于最常见的编译器,您的假设是正确的。 g ++ / gcc对于某些工作你的建议,我不确定其他的。
答案 3 :(得分:1)
实际上,两个类的布局是相同的,但请注意,如果将任何虚函数添加到派生类型,则布局将更改(或至少可以更改)。
现在,从描述中看来,你要做的就是创建一个类型来在现有类之上提供成员函数,如果是这种情况,你应该考虑其他不同的设计,比如免费使用函数(C风格)。
答案 4 :(得分:0)
不要指望它。
但是对于一些常见的编译器来说,内存布局实际上可能是相同的。