boost::shared_ptr und Zuweisung von abgeleiteten Klassen
Übernehmen DerivedClass
ist abgeleitet von BaseClass
Würde das folgende funktionieren?
boost::shared_ptr<BaseClass> a(new BaseClass());
boost::shared_ptr<DerivedClass> b(new DerivedClass());
a=b;
Folgenden Frage, ich verstehe, dass jetzt a
Punkte der abgeleiteten und b
Punkte an der Basis (richtig?)
Auch, wenn ich nun eine Funktion aufzurufen, die über a
würde es nennen die abgeleitete Implementierung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du neu zuweisen, um
a
und dahera
undb
würde jetzt beide auf dasDerivedClass
Objekt. DieBaseClass
Objekt zerstört werden würde, da der Verweiszähler auf null an dieser Stelle (aufgrund dera
wird reasigned zu Punkt zu einem anderen Objekt).Seit
a
jetzt auf einenDerivedClass
- Objekt virtual function calls (definiert inBaseClass
und überschrieben inDerivedClass
) übera
nennen würde, die entsprechenden member-Funktionen inDerivedClass
.Wenn beide
a
undb
außerhalb des Bereichs, derDerivedClass
Objekt zerstört werden würde.Wenn Sie brauchen, um Zugriff auf bestimmte Funktionen der abgeleiteten Klasse über
a
(z.B., nicht-virtuelle Funktionen inDerivedClass
), die Sie verwenden können:Dies ist natürlich nur ein lapidares Beispiel, dass zeigt die Verwendung. In der Produktion code, würden Sie fast sicher test für eine erfolgreiche Besetzung der
DerivedClass
, bevor die Dereferenzierung der Zeiger.static_pointer_cast
auch arbeiten und daher der bevorzugte Weg für den Aufruf einer nicht-virtuellen Funktion inDerivedClass
?boost::static_pointer_cast<DerivedClass>(a)->SomeFunctionOnlyInDerivedClass();
Ja. So wie es ist nichts falsch mit
(Vorausgesetzt, in beiden Fällen, dass BaseClass hat einen virtuellen Destruktor.) Die smart-pointer ist entworfen, um Verhalten sich wie einem einfachen Zeiger, so viel wie möglich, und bieten das gleiche Verhalten wie
BaseClass* pbase = new DerivedClass();
plus, die lifetime-management Güte.Nein, a und b verweisen beide auf die DerivedClass Instanz. Die Swaps, die der verlinkte Artikel bezieht sich auf passiert auf ein temporäres Objekt innerhalb operator=. Wenn das temporäre Objekt den Gültigkeitsbereich verlässt, die BaseClass-Instanz gelöscht werden.
Ja. Wenn Sie einen Blick auf die Umsetzung der Betreiber->, alle es tut, ist, den Zeiger wieder denen die grundlegenden Betreiber-> aufgerufen werden über:
so, dass das Verhalten ist das selbe, wie ein normaler Zeiger.
Tun, wenn "a=b" Sie sagen, ein Punkt zu dem Objekt b auch Punkte zu. Also alle Methoden, die Sie aufrufen, Sie aufrufen, auf die BaseClass Teil des Objekts b-Punkte zu.
Also, wenn es enthält eine virtuelle Methode, die überschrieben wird DerviedClass, die die überschriebene version aufgerufen wird.