auch den Destruktor der Basisklasse aufrufen



  • wie kann ich, wenn ich eine Klasse über einen Verweis der Oberklasse lösche, sichergehen, dass auch der Destrukot der Basisklasse aufgerufen wird?



  • alterbro schrieb:

    wie kann ich, wenn ich eine Klasse über einen Verweis der Oberklasse lösche, sichergehen, dass auch der Destrukot der Basisklasse aufgerufen wird?

    Mach alle Destruktoren der Vererbungshierarchie virtual .



  • Im Übrigen bin ich geschockt, dass du nach 500 Beiträgen noch nicht den Unterschied zwischen einer Klasse und einem Objekt kennst. 😉



  • Was? Der Destruktor der Basisklasse wird immer ausgeführt.



  • okay, also wenn ich sie auf virtual setzte, werden dann alle Destruktoren ausgeführt, egal welchen typ der Verweis hat, oder nur der des jeweils letzten typs?



  • Michael E. schrieb:

    Was? Der Destruktor der Basisklasse wird immer ausgeführt.

    Da er von Verweisen redet, gehe ich davon aus, dass es um Polymorphie geht.



  • .



  • alterbro schrieb:

    okay, also wenn ich sie auf virtual setzte, werden dann alle Destruktoren ausgeführt, egal welchen typ der Verweis hat, oder nur der des jeweils letzten typs?

    Richtig, dann werden alle Destruktoren schön aufgerufen.



  • out schrieb:

    alterbro schrieb:

    okay, also wenn ich sie auf virtual setzte, werden dann alle Destruktoren ausgeführt, egal welchen typ der Verweis hat, oder nur der des jeweils letzten typs?

    Richtig, dann werden alle Destruktoren schön aufgerufen.

    Dafür müssen doch nicht alle virtuell gemacht werden!



  • Danke, hast mir sehr geholfen



  • out schrieb:

    Michael E. schrieb:

    Was? Der Destruktor der Basisklasse wird immer ausgeführt.

    Da er von Verweisen redet, gehe ich davon aus, dass es um Polymorphie geht.

    Auch dann wird der Basisklassendestruktor immer ausgeführt.



  • Sone schrieb:

    out schrieb:

    alterbro schrieb:

    okay, also wenn ich sie auf virtual setzte, werden dann alle Destruktoren ausgeführt, egal welchen typ der Verweis hat, oder nur der des jeweils letzten typs?

    Richtig, dann werden alle Destruktoren schön aufgerufen.

    Dafür müssen doch nicht alle virtuell gemacht werden!

    Der Konsistenz wegen.



  • Michael E. schrieb:

    out schrieb:

    Michael E. schrieb:

    Was? Der Destruktor der Basisklasse wird immer ausgeführt.

    Da er von Verweisen redet, gehe ich davon aus, dass es um Polymorphie geht.

    Auch dann wird der Basisklassendestruktor immer ausgeführt.

    Reden wir aneinander vorbei? Ich verstehe es so, dass er sowas vorhat:

    class foo
    {
    public:
    	~foo() { cout << endl << "foo"; }
    };
    
    class bar : public foo
    {
    public:
    	~bar() { cout << endl << "bar"; }
    };
    
    int main()
    {
    	{
    		std::unique_ptr<foo> p1(new bar);
    	}
    }
    


  • Bei deinem Code wird foo ausgegeben, d.h. der Basisklassendestruktor wird ausgeführt.



  • Michael E. schrieb:

    Bei deinem Code wird foo ausgegeben, d.h. der Basisklassendestruktor wird ausgeführt.

    😃 Jetzt hab ich mich lumpen lassen. Natürlich muss man sicherstellen, dass die Destruktoren der Unterklassen aufgerufen werden. :p



  • Sone schrieb:

    out schrieb:

    alterbro schrieb:

    okay, also wenn ich sie auf virtual setzte, werden dann alle Destruktoren ausgeführt, egal welchen typ der Verweis hat, oder nur der des jeweils letzten typs?

    Richtig, dann werden alle Destruktoren schön aufgerufen.

    Dafür müssen doch nicht alle virtuell gemacht werden!

    Man kann nicht den Basisklassendestruktor virtuell machen, die der abgeleiteten aber nicht virtuell; diese sind dann auf jeden Fall virtuell.



  • Belli schrieb:

    Sone schrieb:

    out schrieb:

    alterbro schrieb:

    okay, also wenn ich sie auf virtual setzte, werden dann alle Destruktoren ausgeführt, egal welchen typ der Verweis hat, oder nur der des jeweils letzten typs?

    Richtig, dann werden alle Destruktoren schön aufgerufen.

    Dafür müssen doch nicht alle virtuell gemacht werden!

    Man kann nicht den Basisklassendestruktor virtuell machen, die der abgeleiteten aber nicht virtuell; diese sind dann auf jeden Fall virtuell.

    Nein. Ich meinte man muss sie nicht markieren. Und was du gesagt hast, hat meine Aussage doch nur bestätigt.



  • Sone schrieb:

    was du gesagt hast, hat meine Aussage doch nur bestätigt.

    Nein, ich habe gesagt, Du machst entweder alle virtuell (zwangsweise), oder keinen, Du hast gesagt, man muss nicht alle virtuell machen.


Log in to reply