statischer/dynamischer cast von Referenzen/Objekten
Ich war Herumspielen mit einer Reihe von casting-Operatoren eine Weile her, die ich anscheinend nicht wirklich an der Zeit. Ich war auf der Suche über mein code jetzt, und ich sah dies:
Base(Derived &p_derived) : m_state(static_cast<Base>(p_derived).m_state){}
Ich denke, nun habe ich ein besseres Verständnis für casting von Zeigern und Referenzen Dank einer sehr gute Antwort hier auf stackoverflow, aber jetzt gibt es Objekte beteiligt. Was genau passiert, wenn der Verweis gegossen, um ein Objekt? Oder was ist, wenn p_derived war das Objekt selbst und nicht nur ein Verweis? Würde Sie es schaffen werden, neue Objekte, und wenn ja, wie würde diese werden instanziert?
Ich bin auch überrascht, dass dies kompiliert werden, da in der Base.h, wo dieser code zu finden ist, Abgeleitet ist, nur vorwärts deklariert, was bedeutet, es sollte nicht wissen, dass es tatsächlich leitet sich von der Basis. Ich habe versucht, an einem anderen Ort zu tun, eine statische Umwandlung aus a Abgeleitet* nach Basis*, aber das würde zu Recht nicht kompilieren, wegen der Arten unvereinbar, soweit diese übersetzung Einheit betroffen war.
InformationsquelleAutor user1130005 | 2012-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie einen Verweis, Sie sind in der Regel tatsächlich mit dem Objekt es sich bezieht. Das ist die Magie, die Transparenz der Referenz-syntax, die Sie nicht bekommen, mit Zeiger; wohl, es ist Ihre Daseinsberechtigung.
Diesem Szenario ist keine Ausnahme: Sie nehmen die
p_derived
Schiedsrichter und der Errichtung einer neuenBase
aus es über schneiden.static_cast<Base&>(p_derived)
gewirkt wird die Referenz selbst, wenn es das ist, was Sie nach (und selbst wenn nicht :P).Ja, das wundert mich auch. Sind Sie sicher? (Demo /Demo - nicht sicher sind, welches Sie verwenden)
Das ist genau das, was ich sage. Was versuchst du zu erreichen mit diesem code? Warum nicht
m_state(static_cast<Base*>(p_derived.m_state.get()))
oder ähnliches?Ja, ich sollte auf jeden Fall lösen es anders. Ich habe mehrere Klassen, die sich aus Basis, die dient als eine Art Schnittstelle zu einem gemeinsamen Staat unter der Ableitung von Klassen, das ist, warum ich muss übergeben Sie ein Objekt (vielleicht Base& besser wäre), um seinen Staat, die privaten zur Basis. Ich bin versucht, Sie zu aktivieren Java code zu C++ und Java erlaubt es, alle Arten von verrückten Abhängigkeiten. Deswegen bin ich auch immer diese Probleme. Ich bin immer noch neugierig, obwohl, warum die static_cast war zulässig. Ist es erlaubt, in C++ zu tun", A A; B b; a = b;" auch wenn A und B nichts gemeinsam hat?
Nur, wenn die Datentypen kompatibel sind. Als ich sagte in meiner Antwort, ich glaube nicht wirklich, dass dein code kompiliert.
Ja, das hast du irgendwie andeuten, dass. Sorry, dass ich antwortete nicht direkt, aber hier ist es: Es macht in der Tat kompilieren. codepad.org/WeXkKovO (Es ist eigentlich ein shared_ptr, aber codepad schien es nicht zu mögen)
InformationsquelleAutor Lightness Races in Orbit