有一个little related question。但这个话题完全不同。
现在,一个概念是关于功能分辨率,另一个是关于class
分辨率?我想知道如果他们使用相同的vtable
(at least in gcc-4.5)怎么可能?这是编译器相关的术语吗?
我知道它可能看起来像是一个基本的愚蠢问题,但我从未想过它。
答案 0 :(得分:3)
Itanium ABI是一个很好的参考,例如http://mentorembedded.github.com/cxx-abi/abi.html#vtable。尽管名称它是一个广泛使用的C ++ ABI,它描述了一个良好的,有效的实现(虽然显然其他实现是可能的)。
答案 1 :(得分:1)
如果您只知道指向它的指针的对象的动态类型,则可以解决这两个问题(虚函数调用和虚拟继承)。 C ++中的每个(多态)对象都只有一个动态类型,它是在构造它时确定的。例如。当您编写new Foo
时,即使您只存储Foo
,该对象也会有动态类型void*
。
vtable
是一种机制,用于存储有关对象动态类型的信息,以便可以通过基指针检索它。你可以在vtable中存储相当多的东西:函数指针,强制偏移,甚至是std::type_info
个对象。