没有成员函数的结构的继承

Inheritance of structs without member functions

本文关键字:结构 继承 函数 成员      更新时间:2023-10-16

这个问题很可能是"C++标准说什么",但我在谷歌上的搜索并没有给我想要的答案。

我知道,当你有类,并且一个类从另一个类继承时,你就会进入虚拟函数表的世界,因为代码需要弄清楚哪个类包含你试图调用的函数。

但是,只包含数据的结构之间的继承呢?例如,如果您有一个小部件结构,然后您想要该结构的专用版本,该版本包含一些额外的变量,但您仍然希望能够将其原始数据传递给处理小部件的函数,那么从原始小部件结构继承比使代码处理两种类型的小部件结构更简单。当继承中只涉及数据时,是否有任何开销?专用小部件仍然是一个简单的结构(就内存布局而言),两个数据都组合在一起,还是原始小部件数据与新数据分开存储?

最终,我希望保持数据的简单性和连续性,就像基本结构一样,我不知道继承数据是否会打破这一点。

在C++内存模型中,对象总是布置在连续内存中。如果希望拥有非连续内存,则需要使用指向该对象外部数据的成员。也就是说,如果继承任何类,无论它是结构还是具有虚拟函数,实际对象总是连续的。关于可能感兴趣的类型,几乎没有其他含义:如果类是标准布局类型,则可以例如memcpy()对象。我不确定C++2011对继承和标准布局类型有什么看法,但我很确定C++2003不允许继承,C++2011允许继承。

要知道,当你有类,并且一个类从另一个类继承时,你就会进入虚拟函数表的世界

只有当你有虚拟功能。。。

因此,为了回答您的问题:如果您有一个没有成员函数的普通struct,那么编译器将不会生成虚拟函数表。

顺便说一句,你不应该担心,这个表是每个类的,每个实例只需要一个简单的额外指针(如果你使用简单的继承)。