Dies ist ähnlich wie bei vielen vorherigen Fragen, aber es fragt etwas, was ich nicht finden konnte Antwort.vptr bei mehrfacher Vererbung auswählen
#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;
}
Insbesondere wie kommt b2 Punkt für VTable vptr von für Base2 abgeleitet b2_fn get()? Ich habe versucht, Memlayout Dump von GCC zu sehen, konnte aber nicht viel herausfinden.
Ihre Frage ist also: "Wie implementiert GCC virtuelle Funktionen mit Mehrfachvererbung"? –
Art von ja, aber um es einzugrenzen, möchte ich wissen, wie es die Bindung durchführt, wenn es mehrere Basisklassen gibt und alle nicht im abgeleiteten Objekt-Layout bei gleichem Offset zugeordnet sind. Ich suche im Grunde die Quelle dieses "Offset". –