如何用虚函数确定sizeof类?

bjs*_*123 6 c++ sizeof vtable

这是一个功课问题.对于以下代码,

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出为:8

任何人都可以解释它是如何8字节?如果vtable实现依赖于编译器,那么在采访中我应该回答这类问题?虚拟基类怎么样?

编辑:我正在使用32位平台.

asc*_*ler 13

这当然取决于实现.它会成为一个糟糕的面试问题.一个优秀的C++程序员可以信任sizeof是正确的,让编译器担心那些可用的东西.

但是这里发生的是一个典型的基于vtable的实现在类C或对象中需要两个vtable D.每个基类都需要自己的vtable.通过添加新的虚拟方法CD可以通过扩展从一个基类中的虚函数表格式来处理,但是所使用的虚函数表AB不能被组合.

在伪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, &D_typeinfo, &B::f2 };

struct D {
  void** vtable_A;
  void** vtable_B;
};

D d = { D_vtable_part1 + 1, D_vtable_part2 + 1 };
Run Code Online (Sandbox Code Playgroud)

  • 对于C++编译器编写者来说,这是一个很好的面试问题...... (9认同)