这是投票最多的答案中对VTT的详细描述。但是答案并没有解释为什么top-offset
VTT中有a。
down_cast
从我的角度来看,当我们base
指向derived
指针时,编译器已经知道offset
需要在编译时调整(当没有虚拟推导时),所以不需要top_offset
在下面的情况下存储a:
class A {
public:
int a;
};
class B {
public:
int b;
virtual void w();
};
class C : public A, public B {
public:
int c;
};
在这种情况下,C 类型的对象的布局如下(数字假设为 32 位指针):
+-----------------------+
| 0 (top_offset) |//why?
+-----------------------+
c --> +----------+ | ptr to typeinfo for C |
| vtable |-------> +-----------------------+
+----------+ | A::v() |
| a | +-----------------------+
+----------+ | -8 (top_offset) |//why?
| vtable |---+ +-----------------------+
+----------+ | | ptr to typeinfo for C |
| b | +---> +-----------------------+
+----------+ | B::w() |
| c | +-----------------------+
+----------+
top_offset
为什么在这种情况下VTT中有a ?我认为 top_offset
andvirtual base offset
只需要在虚拟继承中。