Зависит от компилятора.
В VC ++ указатель vtable хранится в начале выделения объекта перед любыми данными-членами. (При условии, что в вашем классе есть хотя бы одна виртуальная функция-член.)
Также может быть несколько указателей vtable, если ваш класс множественно наследуется от других классов с помощью vtables.
Сами vtables статически размещаются где-то в вашем адресном пространстве .
Тогда компоновка объекта выглядит так (для экземпляра C):
A's VTable ptr
A's member variables.
B's Vtable ptr
B's member variables.
C's member variables.
для иерархии
class A {
virtual Ax() {}
int a, b;
};
class B {
virtual Bx() {}
int c, d;
};
class C : public A, public B {
int foo, bar;
};
vptr обычно в начале объекта ( Imperfect C ++ , Backyard Hotrodding C ++ ), но это не гарантируется стандартом. Использование vptrs и vtables в стандарте не гарантируется.
Если вам действительно нужно знать, где он находится, обычно используют что-то вроде COM, XPCOM, UNO и т. Д., Которые реализуются, по сути, с заданным местом где находится что-то вроде vptr, и укажите способы их использования.
Таблица? Какой vtable? Стандарт C ++ не упоминает vtable. Каждый компилятор может реализовывать виртуальные функции как угодно. И это включает размещение vtable где угодно.