Bitte ignorieren Sie die # include Teile vorausgesetzt, sie sind korrekt durchgeführt. Dies könnte auch implementierungsspezifisch sein (aber auch das Konzept von Vtables), aber ich bin nur neugierig, da es mich dabei unterstützt, die Mehrfachvererbung zu visualisieren. (Ich verwende MinGW 4.4.0 by the way)C++ Mehrere Vererbung Speicher Adressierung Problem
Anfangscode:
class A {
public:
A() : a(0) {}
int a;
};
//Edit: adding this definition instead
void f(void* ptrA) {
std::cout<<((A*)ptrA)->a;
}
//end of editing of original posted code
#if 0
//this was originally posted. Edited and replaced by the above f() definition
void f(A* ptrA) {
std::cout<<ptrA->a;
}
#endif
diese kompiliert und Objektcode erzeugt.
in einer anderen Übersetzungseinheit I (nach der Aufnahme der Header-Datei für obigen Code) verwenden:
class C : public B , public A {
public:
int c;
}objC;
f(&objC); // ################## Label 1
Speichermodelles für ObjC:
//<1> stuff from B
//<2> stuff from B
//<3> stuff from A : int a
//<4> stuff from C : int c
&objC
Startadresse < 1 enthält> im Speichermodell angenommen Wie/wann verschiebt der Compiler es zu < 3>? Tritt es während der Überprüfung des Anrufs bei Label 1
?
EDIT ::
seit Lable 1 scheint ein Geben weg zu sein, nur um es ein wenig dunkler für den Compiler zu machen. Bitte beachten Sie den oben genannten Code. Wann macht der Compiler und wo?
Klasse B soll wie Klasse A aussehen? Vielleicht könnten Sie auch seinen Code hinzufügen. Ziemlich interessante Frage in der Tat. – Haatschii
@Haatschii: Klasse B könnte alles sein. Sie können beliebige Daten unter <1> und <2> des Speichermodells einfügen. Nur aus Gründen der Einfachheit sollten Sie keine virtuellen Funktionen und keine virtuelle Vererbung annehmen. – ustulation