Все просто ... сама vftable - one-per-class
, указатель - one-per-instance
.Два экземпляра одного типа будут иметь указатель vftable, указывающий на одно и то же местоположение.
class A
{
virtual void foo();
virtual void goo();
}
class B : public A
{
virtual void foo();
}
В памяти у вас будет:
vftable for A:
+----------+---------+
| 0x01 | 0x02 |
+----------+---------+
&A::foo() &A::goo()
vftable for B:
+----------+---------+
| 0x11 | 0x12 |
+----------+---------+
&B::foo() &A::goo()
Предположим, вы создали два объекта:
A a;
B b;
Первым членом a будет:
vftableptr: 0x01
Первым членом b будет
vftableptr: 0x11
В общем, полиморфизм реализуется, получая адрес vftable
добавление функции смещения (например, если мы вызываем goo()
, смещение равно 1) и переход к этому месту.Поскольку объекты имеют разные типы, они будут указывать на разные местоположения, хотя таблицы vftable (которые различаются) могут содержать похожие элементы.
ВАЖНОЕ ПРИМЕЧАНИЕ: значения являются поддельными, смещение не 1
ни адреса 0x01
и т. Д., Я выбрал их, чтобы сделать точку.