in C++, Downcast ohne meine Destruktor virtuellen Ist es immer noch möglich, Pointer/Referenzen meiner nicht-polymorphe Basisklasse zu senken?Wie man mit nicht-polymorphe Basisklasse
Antwort
Virtueller Destruktor hat wenig mit Downcasting zu tun. Das Ziel, den Destruktor virtuell zu machen, ist das sichere Löschen durch Zeiger auf die Basis.
Base * ptr = new Derived;
delete ptr; // undefined behavior if Base destructor isn't virtual
einziehe kann static_cast
durchgeführt werden, auf eigene Verantwortung
void processBase(Base * ptr)
{
// undefined behavior if ptr does not point to Derived
// object or some object that inherits from Derived
Derived * derived = static_cast<Derived *>(ptr);
}
Es gibt auch dynamic_cast
, die überprüft, ob gesenkten legal ist, aber es erfordert, dass die Expression Punkte gegossen (oder) bezieht sich auf ein polymorphes Objekt (dh Objekt, das mindestens eine virtuelle Funktion deklariert oder geerbt hat).
5.2.7.6 Andernfalls v wird
Wenn der Typ des gegossenen Ausdrucks ein Zeiger auf oder ein L-Wert eines polymorphen Typs (10.3) seine nicht polymorph ist, kompilieren das Programm fehlschlagen.
Zusammenfassend - macht virtueller Destruktor macht Ihre Klasse polymorph, aber das gleiche wird durch die Deklaration einer anderen virtuellen Member-Funktion erreicht werden. Um dynamic_cast
zu verwenden, benötigen Sie einen polymorphen Typ.
'dynamic_cast' downcast auf einem nicht-polymorphen Typ ist schlecht gebildet. – Oktalist
Es bedeutet, dass ich ein Problem habe, den Wortlaut im Standard zu verstehen. Da sie in diesem Abschnitt die Phrase "v hat einen Zeiger auf cv2 D" verwenden, und in diesem Abschnitt ist es wichtig, den Typ des Ausdrucks vom Typ des spitzen Objekts zu unterscheiden, nahm ich an, dass die Anforderung den vollständigen Typ des Verweises referenziert. Allerdings weist Ideon nicht polymorphe Ausdrücke zurück, also haben Sie recht. –
- 1. Wie wählt man die Python-Basisklasse dynamisch?
- 2. Wie spottet man eine Basisklasse mit Hilfe der Strukturkarte?
- 3. Wie erhält man einen Typ mit Parametern innerhalb der Basisklasse
- 4. Wie man die zerbrechliche Basisklasse mit Hilfsmethoden löst
- 5. Wie man einen abgeleiteten Klassengliedfunktionszeiger mit einer Basisklasse registriert
- 6. Wie initialisiert man geerbte Klasse mit der Basisklasse?
- 7. Wie erbt man privat vom Derivat einer Basisklasse, implementiert aber die öffentliche Schnittstelle der Basisklasse?
- 8. Wie Eigenschaft Basisklasse injizieren Typhoon mit
- 9. Wie "Basisklasse" -Funktion mit Javascript (jQuery) aufrufen?
- 10. Wie erstellt man eine Template Instanziierung für eine abstrakte Basisklasse?
- 11. Wie überprüft man, ob zwei Objekte von derselben Basisklasse erben?
- 12. Wie erweitert man die Contractor-Basisklasse (sqlite3.Database)? nodejs, ES6
- 13. Wie behandelt man Polymorphie, wenn man gleichzeitig mit multiplen Zeigern der Basisklasse arbeitet?
- 14. gemeinsame Basisklasse
- 15. Wie Basisklasse Methode durch Zeiger Basisklasse zeigt auf abgeleitete Klasse
- 16. Perl: Wie importiert man Unterprogramme aus der Basisklasse?
- 17. Wie führt man Page_Load() in der Basisklasse von Page aus?
- 18. Wie man abgeleiteten Zuweisungsoperator von der Basisklasse aufruft?
- 19. Wie man eine Basisklasse für ReactJS-Klassen erstellt
- 20. Wie kann man in Delphi auf die (Super-) Basisklasse zugreifen?
- 21. Berufung abgeleiteten Klasse mit Basisklasse
- 22. Nunit-Basisklasse mit allgemeinen Tests
- 23. Unable Basisklasse mit @Inject Anmerkung
- 24. Groovy: wie Eigenschaften in Basisklasse
- 25. Initialisiere die Basisklasse zu einer abgeleiteten Basisklasse?
- 26. "Basisklasse undefiniert."
- 27. Einstellung meiner Basisklasse mit Cache-Klasse
- 28. Spiel Art der Steuerung mit der Basisklasse
- 29. Class Design - Basisklasse mit generischem Nachkomme
- 30. Wie schreibe ich Komponententests für Unterklasse mit parametrisierten Basisklasse
Ja * könnte * möglich sein, aber Sie müssen möglicherweise 'static_cast' oder' reininterpret_cast' verwenden. * Jedoch *, wenn die Basisklasse nicht polymorph ist und keinen virtuellen Destruktor hat, dann ist es vielleicht nicht die richtige Wahl, von ihr zu erben. Vielleicht solltest du stattdessen die Basisklasse als * Mitglied * haben? Was ist das * tatsächliche * Problem, das du lösen willst? * Warum * verwenden Sie Vererbung? –
Also, ist es richtig zu sagen, dass ich nicht downcast, wenn meine Basisklasse nicht-polymorph ist (keine virtuelle Methode/Destruktor) – Adrika
Mit 'dynamic_cast' ist es nicht möglich. –