boost :: shared_ptr und Zuweisung abgeleiteter Klassen

7

Angenommen DerivedClass wird von BaseClass
abgeleitet Würde Folgendes funktionieren?

%Vor%

Nach dieser Frage , I verstehe, dass nun a auf die abgeleiteten und b auf die Basis zeigt (richtig?)

Wenn ich nun eine Funktion über a aufrufen würde, würde sie die abgeleitete Implementierung aufrufen?

    
Jonathan 27.02.2011, 15:25
quelle

3 Antworten

13
%Vor%

Sie ordnen a neu zu, und daher verweisen a und b jetzt beide auf das Objekt DerivedClass . Das BaseClass -Objekt würde zerstört werden, da sein Referenzzählwert zu diesem Zeitpunkt Null wäre (aufgrund der erneuten Zuordnung von a , um auf ein anderes Objekt zu zeigen).

Da a jetzt auf ein DerivedClass -Objekt zeigt, würden virtuelle Funktionsaufrufe (definiert in BaseClass und überschrieben in DerivedClass ) über a die entsprechenden Elementfunktionen in DerivedClass aufrufen.

Wenn sowohl a als auch b den Gültigkeitsbereich verlassen, wird das DerivedClass -Objekt zerstört.

Wenn Sie über a auf Funktionen zugreifen müssen, die für die abgeleitete Klasse spezifisch sind (z. B. nicht-virtuelle Funktionen in DerivedClass ), können Sie Folgendes verwenden:

%Vor%

Natürlich ist dies nur ein knappes Beispiel, das die Verwendung zeigt. Im Produktionscode würden Sie fast sicher nach einer erfolgreichen Umwandlung in DerivedClass suchen, bevor Sie den Zeiger dereferenzieren.

    
Michael Goldshteyn 27.02.2011, 15:29
quelle
4
  

Angenommen DerivedClass wird von BaseClass abgeleitet. Würde Folgendes funktionieren?

Ja. Genauso wie es mit

nichts falsch ist %Vor%

(In beiden Fällen wird davon ausgegangen, dass BaseClass über einen virtuellen Destruktor verfügt.) Der Smart Pointer soll sich so gut wie möglich wie ein einfacher Zeiger verhalten und das gleiche Verhalten wie BaseClass* pbase = new DerivedClass(); sowie die gesamte Lebensdauer-Verwaltungsgüte bieten.

  

Nach dieser Frage verstehe ich, dass nun a auf die abgeleiteten und b auf die Basis zeigt (richtig?)

Nein, a und b verweisen beide auf die DerivedClass-Instanz. Der Austausch, auf den der verknüpfte Artikel verweist, findet auf einem temporären Objekt in operator = statt. Wenn dieses temporäre Objekt den Gültigkeitsbereich verlässt, wird die BaseClass-Instanz gelöscht.

  

Wenn ich nun eine Funktion über a aufrufen würde, würde sie die abgeleitete Implementierung aufrufen?

Ja. Wenn Sie sich die Implementierung von operator- & gt; ansehen, wird nur der Zeiger zurückgegeben, auf den der fundamentale Operator operator- & gt; angewendet werden soll:

%Vor%

, so dass das Verhalten dasselbe wie ein einfacher Zeiger ist.

    
Martin Stone 27.02.2011 15:51
quelle
3

Wenn du a = b machst, sagst du einem, auf das Objekt zu zeigen, auf das auch b zeigt. So rufen Sie alle Methoden, die Sie aufrufen, auf den BaseClass-Teil des Objekts auf, auf das b zeigt.

Wenn also eine virtuelle Methode in DerviedClass überschrieben wird, wird die überschriebene Version aufgerufen.

    
horstforst 27.02.2011 15:59
quelle