这是一个功课问题.对于以下代码,
#include <iostream> using namespace std; class A { public: virtual void f(){} }; class B { public: virtual void f2(){} }; class C: public A,public B { public: virtual void f3(){} }; class D: public C { public: virtual void f4(){} }; int main() { cout<<sizeof(D)<<endl; }
输出为:8
任何人都可以解释它是如何8字节?如果vtable实现依赖于编译器,那么在采访中我应该回答这类问题?虚拟基类怎么样?
编辑:我正在使用32位平台.
解决方法
这当然取决于实现.它会成为一个糟糕的面试问题.一个优秀的C程序员可以信任sizeof是正确的,让编译器担心那些vtable的东西.
但是这里发生的是一个典型的基于vtable的实现需要在C或D类对象中使用两个vtable.每个基类都需要自己的vtable.由C和D添加的新虚拟方法可以通过从一个基类扩展vtable格式来处理,但是A和B使用的vtable不能组合.
在伪C代码中,这里是类型D的最派生对象在我的实现上的表现(g 4.4.5 Linux x86):
void* D_vtable_part1[] = { (void*) 0,&D_typeinfo,&A::f1,&C::f3,&D::f4 }; void* D_vtable_part2[] = { (void*) -4,&B::f2 }; struct D { void** vtable_A; void** vtable_B; }; D d = { D_vtable_part1 + 1,D_vtable_part2 + 1 };