C++ 虚拟继承和虚拟函数是否使用相同的vtable?

C++ 虚拟继承和虚拟函数是否使用相同的vtable?,c++,vtable,virtual-inheritance,virtual-functions,C++,Vtable,Virtual Inheritance,Virtual Functions,有一个。但主题完全不同 现在,一个概念是关于函数分辨率,另一个是关于class分辨率?我想知道,如果他们使用相同的vtable(),怎么可能呢?这是一个依赖于编译器的术语吗 我知道这似乎是一个基本的愚蠢问题,但我从未想过。这类问题的一个很好的参考是安腾ABI-参见示例。尽管它是一个广泛使用的C++的ABI,它描述了一个很好的、实用的实现(尽管显然其他实现也是可能的)。如果您知道仅指向指针的对象的动态类型,就可以解决这两个问题(虚拟函数调用和虚拟继承)。C++中的每个(多态)对象都有一个动态类型,

有一个。但主题完全不同

现在,一个概念是关于函数分辨率,另一个是关于
class
分辨率?我想知道,如果他们使用相同的
vtable
(),怎么可能呢?这是一个依赖于编译器的术语吗


我知道这似乎是一个基本的愚蠢问题,但我从未想过。

这类问题的一个很好的参考是安腾ABI-参见示例。尽管它是一个广泛使用的C++的ABI,它描述了一个很好的、实用的实现(尽管显然其他实现也是可能的)。如果您知道仅指向指针的对象的动态类型,就可以解决这两个问题(虚拟函数调用和虚拟继承)。C++中的每个(多态)对象都有一个动态类型,它是在构造时确定的。例如,当您编写
new Foo
时,该对象具有动态类型
Foo
,即使您只存储了
void*


vtable
是一种存储对象动态类型信息的机制,可以通过基本指针检索该对象。您可以在VTABLE中存储相当多的东西:函数指针、转换偏移、<代码> STD::Type OngIfs< /Cord>对象。即使是//P>它显然是编译器依赖的,因为C++规范中没有任何任务指定VTABLE。你为什么认为这是不可能的?用一个vtable执行什么样的具体操作是困难的?我不是说这是不可能的,只是想简单地知道它是如何在引擎盖下发生的。@n.m:我当然可以理解OP为什么会考虑不可能。我记得,比亚恩讲述了(可能在《设计与进化》一书中)他是如何苦心经营细节以使自己相信这是可能的。也就是说,有些编译器在某些特殊情况下不正确地实现了虚拟继承。我想您可能会对虚拟表(表)感兴趣,包括虚拟继承及其含义。:)