2012-03-18 89 views
0

这个问题很可能是“C++标准说的是什么”的东西,但是我的Google搜索并没有给出我正在寻找的答案。没有成员函数的结构的继承

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

但是,只包含数据的结构之间的继承又如何呢?例如,如果你有一个小部件结构,然后你想要一个具有一些额外变量的结构的专用版本,但你仍然希望能够将它的原始数据传递给处理小部件的函数,那么将会更简单从原始小部件结构继承,而不是让您的代码处理两种类型的小部件结构。当只有数据涉及继承时,是否有任何开销?专用小部件仍然是一个简单的结构(在内存布局方面),这两个数据都是组合的,还是独立于新数据存储的原始小部件数据?最终,我想保持我的数据简单且连续,因为基本结构是,而且我不知道继承数据是否会破坏数据。

回答

1

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

1

知道,当你上课,你必须从另一个类一个类继承,你进入虚函数表

只有当你有虚函数的世界......

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

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

+0

非常真实。我提到它是使用继承在幕后进行的一个例子。我不知道数据成员是否会在幕后做类似的事情。 – Nairou 2012-03-18 20:20:55

+1

@Nairou:不,没有,因为数据成员不是多态的。 – 2012-03-18 20:29:29