shared_ptr von Basisklasse sicher?



  • Hi,

    Ich habe eine Basisklasse A und einige Subklassen B,C etc die von A erben.

    Ist es jetzt gültiger und sicherer Code, wenn ich einen shared_ptr von A anlege und Subklassen da rein stecke?
    Also:

    std::tr1::shared_ptr<A> aPtr;
    aPtr = new B; 
    aPtr = new C;
    aPtr->methode(); // ruft das jetzt C::methode() auf, wenn methode() virtuell ist
    

    Kann man das so machen? Oder darf ich in aPtr nur auf "new A" zeigen lassen?



  • Das ist gut so, sofern Polymorphie bei den Klassen korrekt genutzt wurde (für Korrektheit im besonderen der Destruktor).



  • drakon schrieb:

    Das ist gut so, sofern Polymorphie bei den Klassen korrekt genutzt wurde (für Korrektheit im besonderen der Destruktor).

    Virtuelle Destruktoren sind für shared_ptr nicht einmal nötig, wenn dieser mit dem dynamischen Typen des Objekts initialisiert wird. Es ist dennoch empfehlenswert, bei polymorpher Verwendung den Destruktor virtuell zu machen, besonders wenn Objekte der Klasse nicht nur in shared_ptr s gehalten werden.

    KlausRR schrieb:

    Kann man das so machen?

    Ja. Im Bezug auf Polymorphie verhält sich shared_ptr<A> nahezu gleich wie A* . Statt des Zuweisungsoperators müsstest du allerdings reset() verwenden.


Anmelden zum Antworten