Вот подробное описание VTT * в ответе с наибольшим количеством голосов. Но ответ не объясняет, почему в VTT есть top-offset
.
С моей точки зрения, когда мы down_cast
указатель base
на указатель derived
, компилятор уже знает, что offset
необходимо отрегулировать во время компиляции (когда есть нет виртуального деривации), поэтому нет необходимости хранить top_offset
в ситуации ниже:
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 | +-----------------------+
+----------+
Почему в VTT top_offset
присутствует в такой ситуации? Я думаю, top_offset
и virtual base offset
необходимы только для виртуального наследования.