Frage zu Destruktor und Vererbung



  • Hallo..
    ich wollte eigentlich nur von euch wissen, ob bei diesem Beispielcode
    der Destruktor der Klasse Tier beim Beenden des Programms automatisch
    aufgerufen wird:

    class Tier
    {
    public:
    	~Tier();
    	//(...)
    protected:
    	char *name;
    	int age;
    };
    
    Tier::~Tier()
    {delete[] name;}
    
    class Panda:private Tier
    {
    public:
    	//(...)
    	int GetAge()
    	{return age;}
    }Panda1;
    

    mfg,
    peter



  • Ja, wird er wohl wenn eine Panda-Instanz ihren Gültigkeitsbereich verlässt.
    Und er wird einen segfault produzieren wenn Du name nicht auf irgendwas zeigen lässt. 😉



  • is klar - deshalb ja auch die "(...)" - Kommentare 😃
    (mich interessierte eigentlich nur, ob der destruktor auch bei der vererbung
    automatisch aufgerufen wird.)

    ps: fragt mich nicht warum ich darauf gekommen bin 🙄



  • pedda mit da currywurscht schrieb:

    (mich interessierte eigentlich nur, ob der destruktor auch bei der vererbung
    automatisch aufgerufen wird.)

    Ja, wird er, allerdings solltest Du darauf achten, den Destruktor von Basisklassen virtuell zu machen.

    ps: fragt mich nicht warum ich darauf gekommen bin 🙄

    Ist ja keine schlechte Frage wenn mans noch nicht weiß, obwohl Du es natürlich auch ausprobieren hättest können... 🙂

    edit: Testcode:

    #include <iostream>
    
    class Tier
    {
    public:
        virtual ~Tier();
    protected:
        char *name;
        int age;
    };
    
    Tier::~Tier()
    { std::clog << "Destruktor von Tier\n"; }
    
    class Panda:private Tier
    {
    public:
        int GetAge()
        {return age;}
    };
    
    int main()
    {
        Panda meinPanda;
    }
    


  • nman schrieb:

    pedda mit da currywurscht schrieb:

    (mich interessierte eigentlich nur, ob der destruktor auch bei der vererbung
    automatisch aufgerufen wird.)

    Ja, wird er, allerdings solltest Du darauf achten, den Destruktor von Basisklassen virtuell zu machen.

    Zumindest wenn du beabsichtigst eine Instanz einer abgeleiteten Klasse über eine Basisklassenreferenz zu löschen. Was hier in diesem Beispiel nicht geht, da privat vererbt wurde. Insofern braucht man hier auch keinen virtuellen Dtor.



  • HumeSikkins schrieb:

    ...da privat vererbt wurde.

    Tatsächlich, das hatte ich ganz übersehen.


Anmelden zum Antworten