Ich habe mehrere Vererbung in C++ für eine ziemlich lange Zeit verwendet, aber nur heute realisiert, dass dies bedeuten könnte, dass die Zeiger-Adressen abweichen könnten, wenn sie als eine der Unterklassen verweisen.Unterklasse Casting und Zeigeradresse Änderungen
Zum Beispiel, wenn ich habe:
class ClassA{
public:
int x;
int y;
ClassA(){
cout << "ClassA : " << (unsigned int)this << endl;
}
};
class ClassC{
public:
int cc;
int xx;
ClassC(){
cout << "ClassC : " << (unsigned int)this << endl;
}
};
class ClassB : public ClassC, public ClassA{
public:
int z;
int v;
ClassB(){
cout << "ClassB : " << (unsigned int)this << endl;
}
};
int main(){
ClassB * b = new ClassB();
}
Klasse A und Klasse C haben unterschiedliche Adressen, wenn auf dem Konstruktor gedruckt.
Doch wenn ich versuche, sie zu ihnen zurück zu werfen, es funktioniert einfach automagically:
ClassA * the_a = (ClassA*)b;
cout << "The A, casted : " << (unsigned int)the_a << endl;
ClassB * the_b = (ClassB*)the_a;
cout << "The B, casted back : " << (unsigned int)the_b << endl;
ich diese Art von Informationen annehmen kann vom Compiler aus dem Code abgeleitet werden, jedoch ist es sicher zu angenommen, dass dies auf allen Compilern funktioniert?
Zusätzliche Frage: Ist es möglich, die Reihenfolge der Unterklassen zu erzwingen? Wenn ich zum Beispiel brauche, dass classA zuerst lokalisiert wird (im Wesentlichen die gleiche Zeigerstelle) wie ClassC, die es abstuft, muss ich es nur in die Deklaration von Unterklassen einfügen? Update Okay, sieht so aus, als ob es nicht möglich ist, die Bestellung zu erzwingen. Ist es noch möglich, die "Wurzel" -Adresse der Struktur, den Anfang der Adresse, die der Unterklasse zugewiesen ist, auf der Oberklassenebene herauszufinden? B. die Adresse von classB von ClassA erhalten.
Ich glaube nicht, dass Sie die _ "root" _ Adresse erhalten können. Ich würde jedoch eine separate Frage dazu stellen. AFAICT aus dem Standard, ist es nicht einmal garantiert, dass Basisklasse Mitglieder oder Unterobjekte in niedrigeren Speicheradressen platziert werden. Mit anderen Worten, es gibt keine Garantie dafür, dass "the_a" eine niedrigere Adresse hat als "the_b" oder irgendetwas von der Art. –