Vtable放置完全纯虚拟类

tgo*_*art 4 c++ interface pure-virtual vtable

根据我对C++规范的了解(有限),具有虚拟成员的类的vtable被放置在第一个非纯非内联虚拟方法的定义中.编译器如何处理从具有ALL纯虚方法(例如接口)的类继承的类?在这种情况下,vtable放在哪里?

fuz*_*Tew 5

vtable存储已实现的虚拟方法的地址.如果类的所有方法都是纯虚拟的并且没有实现,则不需要生成vtable.

如果没有从中派生出来并实现方法的一些类,你就不能使用这样的类.每个具有已实现的虚方法的类都有自己的单个vtable,其中包含所有虚方法的地址:它不以任何方式引用基类的vtable; 地址重复.因此,如果您有一个继承自另一个类的类,那么该类将只使用自己的vtable.它不关心基类的vtable; 这个vtable甚至不需要存在.

C++规范本身对vtable没有任何说明; 它们只是一种编译器行为,已经变得很普遍.