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

时间:2012-03-18 20:13:18

标签: c++ inheritance

这个问题可能是“C ++标准说的是什么”的问题,但是我的谷歌搜索并未给出我正在寻找的答案。

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

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

最终,我想保持我的数据简单和连续,作为基本结构,我不知道继承数据是否会破坏它。

2 个答案:

答案 0 :(得分:1)

  

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

只有你有虚拟功能......

所以回答你的问题:如果你有一个没有成员函数的普通struct,那么编译器就不会生成虚函数表。

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

答案 1 :(得分:1)

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