Это похоже на многие предыдущие вопросы, но он спрашивает то, что я не смог найти.Выбор vptr в случае множественного наследования
#include <iostream>
using namespace std;
class Base1 {
public:
int b1_data;
virtual void b1_fn() {cout << "I am b1\n";}
};
class Base2 {
public:
int b2_data;
virtual void b2_fn() {cout << "I am b2\n";}
};
class Derived : public Base1, public Base2 {
public:
int d_data;
void b1_fn() {cout << "I am b1 of d\n";}
void b2_fn() {cout << "I am b2 of d\n";}
};
int main() {
Derived *d = new Derived();
Base1 *b1 = d;
/*My observation mentioned below is implementation dependant, for learning,
I assume, there is vtable for each class containing virtual function and in
case of multiple inheritance, there are multiple vtables based on number of
base classes(hence that many vptr in derived object mem layout)*/
b1->b1_fn(); // invokes b1_fn of Derived because d points to
// start of d's memory layout and hence finds vtpr to
// Derived vtable for Base1(this is understood)
Base2 *b2 = d;
b2->b2_fn(); // invokes b2_fn of Derived but how? I know that it "somehow"
// gets the offset added to d to point to corresponding Base2
// type layout(which has vptr pointing to Derived vtable for
// Base2) present in d's memory layout.
return 0;
}
В частности, как же точки b2 в vptr для производных виртуальных таблиц для Base2, чтобы добраться до b2_fn()? Я пробовал видеть memlayout дамп из gcc, но не мог понять много.
Итак, ваш вопрос: «Как GCC реализует виртуальные функции с множественным наследованием»? –
Вид да, но чтобы сузить его, я хочу знать, как он выполняет привязку, когда есть несколько базовых классов, и все они не отображаются в макете объектов с одинаковым смещением. В принципе, источник этого «смещения» я ищу. –