有一个相关的小问题。但主题完全不同。
现在,一个概念是关于函数解析,另一个是关于class
解析?我想知道如果他们使用相同的vtable
(至少在 gcc-4.5 中)怎么可能?这是一个依赖于编译器的术语吗?
我知道这可能看起来像一个基本的愚蠢问题,但我从来没有想过它。
有一个相关的小问题。但主题完全不同。
现在,一个概念是关于函数解析,另一个是关于class
解析?我想知道如果他们使用相同的vtable
(至少在 gcc-4.5 中)怎么可能?这是一个依赖于编译器的术语吗?
我知道这可能看起来像一个基本的愚蠢问题,但我从来没有想过它。
此类事情的一个很好的参考是 Itanium ABI - 参见例如http://mentorembedded.github.com/cxx-abi/abi.html#vtable。尽管名称如此,但它是 C++ 中广泛使用的 ABI,它描述了一个很好的、有效的实现(尽管显然其他实现也是可能的)。
如果您知道一个对象的动态类型,只需一个指向它的指针,您就可以解决这两个问题(虚拟函数调用和虚拟继承)。C++ 中的每个(多态)对象都只有一种动态类型,它在构造它的那一刻就确定了。例如,当您编写时new Foo
,该对象具有动态类型Foo
,即使您只存储一个void*
.
Avtable
是一种存储有关对象动态类型的信息的机制,以便可以通过基指针对其进行检索。您可以在 vtable 中存储很多东西:函数指针、转换偏移量,std::type_info
甚至对象。