обьект класса А вместе со всеми нужными штуками, как this и vfptr, а уже потом после объекта класса А записываются переменные объекта класса В. Благодаря этому возможно такое:
B b;
A* ptrA = &b;
Если объект класса А весит 20 байт, а обьект класса В весит 30байт, то указатель на А будет считывать первые 20 байт, где будут и vfptr, и this. То есть Aptr будет пользоваться служебными штуками объекта класса А.
А что происходит при множественном наследовании?:
A, B --> C
C c;
A* Aptr = &c;
B* Bptr = &c;
vfptr и this дублируются для каждого родителя или что?
P.s. Нашел код из википедии, но все равно остаются вопросы, как Bptr понимает, что при указании на обьект класса C надо сместиться на 8 байт от начала:
class B1 {
public:
void f0() {}
virtual void f1() {}
int int_in_b1;
};
class B2 {
public:
virtual void f2() {}
int int_in_b2;
};
class D : public B1, public B2
{
public:
void d() {}
void f2() {} // переопределяем B2::f2()
int int_in_d;
};
D *d = new D();
d:
+0: указатель на ТВМ D (для B1)
+4: значение int_in_b1
+8: указатель на ТВМ D (для B2)
+12: значение int_in_b2
+16: значение int_in_d
Общий размер: 20 байтов.
ТВМ D (для B1):
+0: B1::f1() // B1::f1() не переопределён
ТВМ D (для B2):
+0: D::f2() // B2::f2() замещён D::f2()
ты почему-то считаешь, что указатель в C++ это просто число :) стандарт предполагает что это своего рода чёрный ящик
Ну просто адрес, где по типу, на который указывает указатель, компилятор сообщает, на сколько сместиться, чтобы считать *ptr(ну типа арифметика указателей)
Обсуждают сегодня