Wenn Sie einen void * Zeiger auf abgeleitete Klasse, die von beiden BaseA
und BaseB
erbt, wie funktioniert der Compiler den void*
Zeiger auf BaseA*
werfen (oder BaseB*
), ohne zu wissen, dass der void*
Zeiger vom Typ ist Derived
?Casting mit Mehrfachvererbung
Antwort
Es tut es nicht. Die einzige Garantie, wenn zu und von einem void*
Gießen eines static_cast
verwenden ist:
Ein Wert vom Typ Zeiger auf „Zeiger auf
cv void
“ Objekt konvertiert und zurück auf den ursprünglichen Zeigertyp wird seinen ursprünglichen Wert (C + haben, +03 §5.2.9/10).
Zum Beispiel der folgende Code falsch ist, weil die void*
zu einem anderen Typ als der ursprünglichen Zeigertyp umgewandelt wird (die Guss Sequenz ist B1*
->void*
->B2*
):
struct B1 { int i; };
struct B2 { int j; };
struct D : B1, B2 { };
D x;
B1* b1ptr = &x;
void* voidptr = b1ptr;
B2* b2ptr = static_cast<B2*>(voidptr);
Versuch b2ptr
hier zu verwenden würde zu undefiniertem Verhalten führen. Der einzige Typ, auf den Sie voidptr
sicher übertragen können, ist B1*
, da das der Typ ist, aus dem void*
erhalten wurde (nun, oder zu einem char*
, da alles über eine char*
zugegriffen werden kann).
Der Compiler wirft den void*
Zeiger auf nichts - Sie, der Programmierer, tun.
Um etwas Sinnvolles mit einem void*
Zeiger zu tun, müssen Sie explizit Guss es zu einem nicht void*
Zeiger, und wenn Sie falsch sind, was auf den Zeiger tatsächlich Punkte eingeben, geben Sie nicht definiertes Verhalten Stadt .
- 1. C# Mehrfachvererbung
- 2. Mehrfachvererbung in Python mit super()
- 3. Mehrfachvererbung von Eltern mit Prototypen
- 4. Sind Schnittstellen redundant mit Mehrfachvererbung?
- 5. Python - Mehrfachvererbung mit demselben Namen
- 6. C++ Mehrfachvererbung
- 7. Virtuelle Mehrfachvererbung
- 8. Mehrfachvererbung - virtual
- 9. Arten Mehrfachvererbung
- 10. mit Qt Signale und Slots mit Mehrfachvererbung
- 11. Mehrfachvererbung auf Java-Schnittstellen
- 12. Wie vermeidet man Mehrfachvererbung?
- 13. Vorlage Mehrfachvererbung mehrdeutige Symbolfehler
- 14. Casting-Fehler mit Reflektion
- 15. Casting Fehler mit ConnectionStringSettingsCollection
- 16. Casting Schnittstellen mit iList
- 17. ‚Casting‘ mit Reflexion
- 18. Casting "mit" Interface
- 19. C# Casting mit Objekten
- 20. C++ - Mehrfachvererbung Frage
- 21. Metaclass Mehrfachvererbung Inkonsistenz
- 22. virtuelle Methodentabelle für Mehrfachvererbung
- 23. Mehrfachvererbung: gleicher Variablenname
- 24. C++ Mehrfachvererbung: Funktionsmismatch?
- 25. Mehrfachvererbung und variadische Vorlagen
- 26. Eine Verwendung für Mehrfachvererbung?
- 27. C++ Zeiger Casting Problem
- 28. Mehrfachvererbung, Schnittstelle vs Zusammensetzung mit in Java
- 29. constexpr Fehler, std :: is_same mit Mehrfachvererbung
- 30. C++ Mehrfachvererbung Speicherlayout mit "Leere Klassen"
Ihre Antwort ist korrekt. Aus meiner Forschung, wenn abgeleitete BaseA und BaseB erweitert, wird das Objekt im Speicher als | BaseA | BaseB | Derived | angelegt. Daher zeigt der Zeiger auf den Anfang von BaseA, so dass das Ableiten von BaseB zu BaseA die Mitglieder lesen lässt. – Chazz