001
14.01.2018, 20:09 Uhr
ao
(Operator)
|
b), c) und d) sind richtig beantwortet.
a) und f) sind trivial zu googeln, das machst du bitte selber. Wenn du das, was du findest, nicht verstehst, dann frag nochmal nach.
e) Der virtuelle Destruktor sorgt dafür, dass, wenn das Objekt nur über einen Basisklassenzeiger referenziert wird, trotzdem die ganze Klassenhierarchie zerlegt wird und nicht nur das Basisklassen-Objekt. Beispiel:
C++: |
#include <iostream>
class Base { public:
// virtual ~Base () { std::cout << "~Base" << std::endl; } };
class Derived : public Base { public: ~Derived () { std::cout << "~Derived" << std::endl; } };
int main () { Base * b = new Derived (); delete b; }
|
Ist das "virtual" in class Base aktiv (also der Destruktor virtuell), dann erzeugt der Aufruf delete b; die Ausgabe: ~Derived ~Base weil nacheinander die Destruktoren von Derived und Base aufgerufen werden.
Ist der Destruktor nicht virtuell, dann erhält man nur die Ausgabe ~Base Der Derived-Teil des Objekts wird also nicht abgeräumt, und wenn Derived Resourcen belegt (Speicher, Dateien, Sockets etc.), dann werden diese nicht wieder freigegeben.
Klar? Dieser Post wurde am 14.01.2018 um 20:12 Uhr von ao editiert. |