Meine Frage ist, wie kann ich auf das "obj" Mitglied zugreifen, wenn ich einen Zeiger auf die Basisklasse ("a") auf Kindklasse ("b ") Objekt? Ich weiß, dass Casting den Trick machen sollte, aber ich suche nach besseren Lösungen.Zugreifen auf untergeordnete Klassenmitglieder mit Zeiger auf eine Basis abstact Klasse
Antwort
Mit dem Operator dynamic_cast<>
können Sie einen Zeiger auf a
in einen Zeiger auf b
konvertieren. Die Umwandlung wird nur gelingen, wenn der Laufzeittyp des Objekts zu spitz durch ptr
ist b
, und wird ein Null-Zeiger andernfalls zurückkehren, so dass Sie das Ergebnis nach der Konvertierung überprüfen müssen:
b* p = dynamic_cast<b*>(ptr);
if (p != nullptr)
{
// It is safe to dereference p
p->foo();
}
Wenn Sie garantieren können, dass Der Typ des Objekts, auf das ptr
zeigt, ist b
, aber in diesem Fall (da keine virtuelle Vererbung beteiligt ist) können Sie sogar static_cast<>
verwenden, was mit weniger Aufwand verbunden ist, da es zur Kompilierungszeit ausgeführt wird.
b* p = static_cast<b*>(ptr);
// You are assuming ptr points to an instance of b. If your assumption is
// correct, dereferencing p is safe
p->foo();
Sie müssen die Vererbungshierarchie ablegen. Ihr Fall ist für die Verwendung von dynamic_cast
auf den entsprechenden Typ maßgeschneidert, da Sie damit typsicher einchecken können, wenn das Objekt, das Sie tatsächlich zu werfen versuchen, vom erwarteten Typ ist.
Ich habe nicht an dynamic_cast gedacht, das sollte das Problem lösen, da es typsicher ist. – user1873947
In GCC und Clang (und in Visual Studio glaube ich) Sie auch folgenden syntaktischen Zucker
if (Base* x = dynamic_cast<Base*>(x)) {
// do something with \c x now that we know its defined
}
und in C++ 11 verwenden können, mit auto
Typinferenz, noch schöner
if (auto x = dynamic_cast<Base*>(x)) {
// do something with \c x now that we know its defined
}
und schließlich, wenn wir nur zu lesenden Zugriff
if (const auto x = dynamic_cast<Base*>(x)) {
// read something from \c x now that we know its defined
}
01 einschränken möchten
Beachten Sie, dass dies den Bereich von x
auf die Innenseite der If-Klausel (s) beschränkt, was oft bequemer ist, wenn wir mehrere aufeinander folgende dynamic_cast nacheinander unter Verwendung von if
und else if
durchführen.
- 1. Zugreifen auf C# -Klassenmitglieder in IronPython
- 2. Wofür werden Zeiger auf Klassenmitglieder verwendet?
- 3. Zugreifen auf Mitglied der Struktur mit Zeiger
- 4. Auf untergeordnete Objekte in JavaScript zugreifen
- 5. C++ Zeiger auf Klasse
- 6. Zugreifen auf Elemente durch Zeiger im Vektor Zeiger auf Strukturen + Zeiger Typ ist erforderlich
- 7. Erstellen eine neue Klasse auf der Basis vorhandene Klasse
- 8. Zugriff auf Klassenmitglieder eines Webservice in silverlight
- 9. Zeiger auf Klasse vs Zeiger auf eingebaute Typen
- 10. C++ Zeiger auf eine Memberfunktion einer Klasse mit übereinstimmenden Funktionssignaturen
- 11. Wie kann eine abgeleitete Klasse auf die privaten Mitgliedsdaten zugreifen?
- 12. C++ | Zugriff auf die abgeleitete Klassenmethode über Zeiger-zu-Basis?
- 13. Zeiger auf eine Karte
- 14. Make-Extension-Methode auf Basis Klasse .NET
- 15. Roles.IsUserInRole() auf Meine Basis Seite Klasse
- 16. Zeiger auf Array der Basisklasse, füllen mit abgeleiteten Klasse
- 17. Kann ich auf eine Membervariable einer untergeordneten Klasse über einen Verweis auf eine übergeordnete Klasse zugreifen?
- 18. Zugriff auf untergeordnete Klasseneigenschaften durch Funktion in der übergeordneten Klasse
- 19. In C, ein Zeiger auf eine Struktur, die auf eine Liste von Byte-Zeigern zugreifen muss
- 20. Zeiger auf Zeiger auf Struct
- 21. Zeiger auf eine andere Instanz.
- 22. nicht aufgelöstes externes Symbol auf statische Klassenmitglieder
- 23. Warum kann eine abgeleitete Klasse nicht über einen Zeiger auf Base auf ein geschütztes Member ihrer Basisklasse zugreifen?
- 24. Mit Ostream So auf Zeiger auf Objekte
- 25. C# - werfen generische Klasse auf der Basis nicht-generische Klasse
- 26. Zeiger auf Klasse, Implementierung mehrerer Schnittstellen
- 27. Zugriff auf Zeiger in einem Zeiger auf eine Union
- 28. prüft ein Zeiger auf eine bestimmte Klasse C++
- 29. Auf anderen Programmspeicher zugreifen
- 30. Sicherheit von static_cast auf Zeiger-to-abgeleitete Klasse von der Basis destructor
Einige Kontext würde helfen. Warum willst du das tun? Wenn das Casting keine Option ist, müssen Sie in Ihrer abgeleiteten Klasse eine virtuelle Funktion überschreiben, die einen Verweis oder Zeiger auf dieses Member zurückgibt. Dies bricht jedoch im Allgemeinen die Einkapselung. Das bringt uns zurück zu dem Grund, warum Sie auf den abgeleiteten Klassenmember durch einen Zeiger auf die Basisklasse zugreifen möchten? – Void
@Void wahrscheinlich hast du Recht, ich sollte das Design ändern. – user1873947