ich vor kurzem ein Problem mit Abgüssen und Mehrfachvererbung hatte: Ich habe eine Base*
-Unrelated*
, werfen benötigt, da eine bestimmte Derived
Klasse die Unrelated
-Klasse abgeleitet.Mehrfachvererbung Besetzung funktioniert nicht wie erwartet
Dies ist ein kurzes Beispiel:
#include <iostream>
struct Base{
virtual ~Base() = default;
};
struct Unrelated{
float test = 111;
};
struct Derived : Base,Unrelated{};
int main(){
Base* b = new Derived;
Unrelated* u1 = (Unrelated*)b;
std::cout << u1->test << std::endl; //outputs garbage
Unrelated* y = dynamic_cast<Unrelated*>(b);
std::cout << y->test << std::endl; //outputs 111
}
Die erste Besetzung eindeutig nicht funktioniert, aber die zweite hat funktioniert. Meine Frage ist: Warum hat die zweite Besetzung funktioniert? Sollte dynamic_cast
nur für Cast zu einem verwandten Klassentyp funktionieren? Ich dachte, es gab keine Informationen über Unrelated
zur Laufzeit, weil es nicht polymorph ist.
Edit: Ich habe culirus gcc für das Beispiel verwendet.
Sie behalten den Zeiger auf abgeleitete Instanz in b und Sie werfen es auf Unrelated, von dem Sie erben. Was ist das Problem? – threaz
'Unrelated' ist eine Basis von' Derived' und Sie transformieren von 'Derived *' nach 'Unrelated *', weshalb dies gültig ist. – ArchbishopOfBanterbury
Eek. C-Stil wirft. Benutze sie nicht. Verwenden Sie stattdessen den richtigen C++ - Cast - immer. –