таблица виртуальных методов для множественного наследования
Я читаю эту статьюТаблица виртуальных методов"
Пример в приведенной выше статье:
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() {} // override B2::f2()
int int_in_d;
};
B2 *b2 = new B2();
D *d = new D();
В статье автор вводит в память макет объектаd
это так:
d:
D* d--> +0: pointer to virtual method table of D (for B1)
+4: value of int_in_b1
B2* b2--> +8: pointer to virtual method table of D (for B2)
+12: value of int_in_b2
+16: value of int_in_d
Total size: 20 Bytes.
virtual method table of D (for B1):
+0: B1::f1() // B1::f1() is not overridden
virtual method table of D (for B2):
+0: D::f2() // B2::f2() is overridden by D::f2()
Вопрос оd->f2()
, Призыв кd->f2()
проходитB2
указатель какthis
указатель, поэтому мы должны сделать что-то вроде:
(*(*(d[+8]/*pointer to virtual method table of D (for B2)*/)[0]))(d+8) /* Call d->f2() */
Почему мы должны пройтиB2
указатель какthis
указатель не оригиналD
указатель??? На самом деле мы вызываем D :: f2 (). Исходя из моего понимания, мы должны пройтиD
указатель какthis
в функцию D :: f2 ().
___Обновить____
Если прохождениеB2
указатель какthis
в D :: f2 (), что если мы хотим получить доступ к членамB1
класс в D :: f2 () ?? Я верюB2
указатель (это) показывается так:
d:
D* d--> +0: pointer to virtual method table of D (for B1)
+4: value of int_in_b1
B2* b2--> +8: pointer to virtual method table of D (for B2)
+12: value of int_in_b2
+16: value of int_in_d
У этого уже есть определенное смещение начального адреса этой непрерывной структуры памяти. Например, мы хотим получить доступb1
внутри D :: f2 (), я думаю, во время выполнения это будет выглядеть примерно так:*(this+4)
(this
указывает на тот же адрес, что и b2), который будет указыватьb2
вB
????