tol64: Haben Sie eine Sicherheitslücke gefunden? )
Jep. Es ist ungöttlich, direkt so zu casten. In Plus gibt es dynamic_cast speziell für diesen Zweck, hier kann man nicht ganz korrekt casten und es ist eine potentielle Quelle für implizite und schwerwiegende Fehler. Und in Bezug auf die Ernsthaftigkeit ist es nicht viel besser als unsichere Zeiger und Referenzen.
Die Sache ist die, dass die Erbenklassen CChartObjectRectLabel, CChartObjectButton und CChartObjectEdit ihre eigenen Methoden haben, auf die zugegriffen werden muss. Und die Basisklasse CChartObject aus der Standardbibliothek hat nicht die gleichen virtuellen Methoden.
TheXpert: Das stimmt. Es ist unorthodox, direkt so zu casten. In Plus gibt es dynamic_cast speziell für diesen Zweck, hier kann man es nicht ganz korrekt casten und es ist eine potentielle Quelle für implizite und ernsthafte Fehler. Und im Ernst, es ist nicht viel besser als unsichere Zeiger und Referenzen.
Ja, bevor ich hier im Forum eine Frage gestellt habe, habe ich im Netz gefunden, dass C++ den dynamic_cast-Operator hat (ein Mechanismus der dynamischen Datenidentifikation).
Jetzt schaue ich mir den obigen Link an:
// Der Mechanismus der dynamischen Datentypidentifizierung ist nur für polymorphe Datentypen verfügbar. // Klassen (d. h. Klassen, die mindestens eine virtuelle Mitgliedsfunktion enthalten)
Es ist also eine obligatorische Bedingung? Und wenn es keine virtuellen Methoden in der Basisklasse gibt, dann wird dynamic_cast nicht funktionieren?
P.S. >>> Hier lese ich gerade mehr über dynamic_cast (MSDN).
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Haben Sie eine Sicherheitslücke gefunden? )
Wäre es nicht besser, Polymorphismus zu verwenden?
Ungefähr:
Die Sache ist die, dass die Erbenklassen CChartObjectRectLabel, CChartObjectButton und CChartObjectEdit ihre eigenen Methoden haben, auf die zugegriffen werden muss. Und die Basisklasse CChartObject aus der Standardbibliothek hat nicht die gleichen virtuellen Methoden.
Zu meinem obigen Beispiel...
Zugriff auf Methoden von Erbenklassen?
...dann sieht es so aus:
Das stimmt. Es ist unorthodox, direkt so zu casten. In Plus gibt es dynamic_cast speziell für diesen Zweck, hier kann man es nicht ganz korrekt casten und es ist eine potentielle Quelle für implizite und ernsthafte Fehler. Und im Ernst, es ist nicht viel besser als unsichere Zeiger und Referenzen.
Ja, bevor ich hier im Forum eine Frage gestellt habe, habe ich im Netz gefunden, dass C++ den dynamic_cast-Operator hat (ein Mechanismus der dynamischen Datenidentifikation).
Jetzt schaue ich mir den obigen Link an:
Es ist also eine obligatorische Bedingung? Und wenn es keine virtuellen Methoden in der Basisklasse gibt, dann wird dynamic_cast nicht funktionieren?
P.S. >>> Hier lese ich gerade mehr über dynamic_cast (MSDN).
Scheiße, und danach reden Sie von Sprachsicherheit?
Wahrscheinlich denken Sie, dass Sie wie in C/C++ frei auf alles casten können.
Dem ist nicht so, und an der Sicherheit gibt es nichts auszusetzen.
Wahrscheinlich denken Sie, dass Sie wie in C/C++ frei auf alles casten können.
Das ist nicht der Fall, und es gibt keine Sicherheitsprobleme.
Ich bin zufällig auf diesen Fehler gestoßen, der Ihre Worte zu bestätigen scheint. )
Das ist nicht der Fall, und es gibt nichts, was gegen die Sicherheit spricht.
Nein, es ist unmöglich, dynamic_cast zur Kompilierzeit zu prüfen.
Der obige Kommentar zeigt das Ergebnis der Casting-Prüfung in rantime.
Es ist sehr starr, es funktioniert auf RTTI-Mechanismus, weil wir genau wissen, wer wer im Falle von Geistern ist.
Der obige Kommentar zeigt das Ergebnis der Casting-Prüfung in rantime.