虚继承和虚函数使用相同的虚函数表吗?

3

这里有一个与内容略有关联的问题,但话题完全不同。

现在,一个概念是关于函数解析,另一个是关于class解析?我想知道如果它们使用相同的vtable至少在gcc-4.5中),那么这是否是编译器相关的术语?

我知道这可能看起来是一个基础的愚蠢问题,但我从未想过。


5
这明显取决于编译器,因为C++规范中没有强制要求虚函数表(vtable)。 - andrewdski
一个实现肯定可以同时使用单个vtable来完成两个目的。你为什么认为这是不可能的?只用一个vtable会有哪些具体操作难以执行? - n. m.
我并不是说这是不可能的,只是想简要了解它在底层是如何实现的。 - iammilind
1
@n.m:我完全可以理解为什么这位楼主在考虑不可能性。据我回忆,Bjarne曾经(可能是在《设计与演化》一书中)讲述过他如何费尽心思地解决细节问题,以使自己相信这是可能的。这并不是琐碎的事情,例如,在某些极端情况下,一些编译器错误地实现了虚拟继承。 - Cheers and hth. - Alf
我认为你可能会对这篇论文感兴趣,它涵盖了虚拟表(table)的所有内容,包括虚拟继承及其影响。 :) - Xeo
@Xeo "你可能会对这篇论文感兴趣",你是指这篇博客吗? - curiousguy
2个回答

3
这种事情的好参考是Itanium ABI - 例如,可以查看http://mentorembedded.github.com/cxx-abi/abi.html#vtable。尽管名称如此,但它是C++中广泛使用的ABI,并且它描述了一个良好的、可工作的实现(尽管显然也可能存在其他实现)。

1
如果您只有一个指向对象的指针,但是您知道该对象的动态类型,那么您可以解决虚函数调用和虚继承两个问题。在C++中,每个(多态)对象都恰好有一个动态类型,该类型在构造对象时确定。例如,当您编写new Foo时,即使您仅存储了void*,该对象也具有动态类型Foovtable是一种机制,用于以这样的方式存储有关对象的动态类型的信息,以便可以通过基指针检索它。您可以在vtable中存储许多内容:函数指针、转换偏移量、std::type_info对象等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接