Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NachoMan

Community-Fossil

  • »NachoMan« ist der Autor dieses Themas

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

1

04.09.2012, 04:35

virtuelle Destruktoren...

Edit by dot: abgetrennt von hier

Ein virtueller Destruktor macht sowieso erst dann sinn, wenn eine andere Methode auch virtuell ist und anders herum.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (04.09.2012, 14:39)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

04.09.2012, 09:16

Ein virtueller Destruktor macht sowieso erst dann sinn, wenn eine andere Methode auch virtuell ist und anders herum.


Wieso? Vererbung impliziert nicht, dass man zwangsläufig Methoden überschreiben können muss.
@D13_Dreinig

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

04.09.2012, 11:09

Jo, wichtig dabei sind nicht überschriebene Methoden, sondern interne Ressourcen, die im Destruktor freigegeben werden müssen. Aber muss er dafür virtuell sein? Ich dachte die Destruktoren werden von allein in der Hierarchie nach oben der Reihe nach aufgerufen? Gilt das nur bei virtuellen Destruktoren? (Oh man, so viel C# und Java tut für C++ auf Dauer nicht gut :P)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

04.09.2012, 11:19

Richtig, der Destruktor einer abgeleiteten Klasse ruft implizit den Destruktor der Basis auf.

Ein virtueller Destruktor ist nur notwendig, wenn man ein Objekt einer abeleiteten Klasse über einen Basisklassenzeiger deleten möchte...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

04.09.2012, 11:19

Aber muss er dafür virtuell sein? Ich dachte die Destruktoren werden von allein in der Hierarchie nach oben der Reihe nach aufgerufen? Gilt das nur bei virtuellen Destruktoren? (Oh man, so viel C# und Java tut für C++ auf Dauer nicht gut :P)


Ja, stimmt fast immer. Aber bei diesem Beispiel muss der Destruktor virtuell sein (oder zumindest protected), falls "Derived" korrekt zerstört werden soll.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Base
{
public:
  /*virtual */ ~Base()
  {
    printf("Base::~Base\n");
  }
};

class Derived : public Base
{
public:
  ~Derived()
  {
    printf("Derived::~Derived\n");
  }
};

int main()
{
  Base* foo = new Derived;
  delete foo;
}
@D13_Dreinig

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

04.09.2012, 12:06

Oh, das is ja böse. Werde ich mir versuchen zu merken, falls ich mal wieder an C++ gelassen werde.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

idontknow

unregistriert

7

04.09.2012, 12:26

Mal etwas offtopic, aber wie funktioniert sowas dann eigentlich "intern".

Wenn ich kein vtable habe aber eine Klasse ableite und in der einen Destruktor implementiere, dann weiß die Klasse ja jetzt mal aus "C++-Code-Sicht" nicht, dass sie den Destruktor der Basis auch aufrufen soll am Ende. Packt da der Compiler einfach den Destruktoraufruf der Basis ans Ende des Destruktors der abgeleiteten Klasse? Wie wird das umgesetzt?

Aus Sicht der Basis (ohne virtual) macht es ja so gesehen Sinn, dass der Destruktor der abgeleiteten Klasse nicht aufgerufen wird, aber wenn ich den Destruktor virtual mache was genau passiert dann? Bin mir ehrlich gesagt auch nicht ganz sicher, wie genau vtables funktionieren aber so wie ich es im Kopf habe wird einfach der Pointer auf die Methode beim überladen (in dem Fall vom Destruktor) auf den Destruktor der abgeleiteten Klasse geändert, aber das kann nicht ganz stimmen, denn wie soll dann der Destruktor der Basis aufgerufen werden?

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

8

04.09.2012, 12:31

(oder zumindest protected)


Was meinst du denn mit protected ???
Wenn du polymorph programmiers und willst das alle Destruktoren durchlaufen werden müssen diese virtuell sein.
Protected kannst du auf Destruktoren nicht anwenden.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

04.09.2012, 12:32

Packt da der Compiler einfach den Destruktoraufruf der Basis ans Ende des Destruktors der abgeleiteten Klasse?

exakt

[...] aber wenn ich den Destruktor virtual mache was genau passiert dann?

Dann wird der Destruktor zu einer virtuellen Methode...

[...] aber das kann nicht ganz stimmen, denn wie soll dann der Destruktor der Basis aufgerufen werden?

Wo liegt denn das Problem, der abgeleitete Destruktor ruft doch den der Basis auf? ;)


Wenn du polymorph programmiers und willst das alle Destruktoren durchlaufen werden müssen diese virtuell sein.

Nope, nur wenn du Objekte über Basisklassenzeiger deleten willst.

Protected kannst du auf Destruktoren nicht anwenden.

Natürlich, wieso nicht? Das ist sogar eine sehr gängige Methode um z.B. die Zerstörung von Objekten bestimmter Typen außerhalb eines erlaubten Kontexts zu verbieten...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (04.09.2012, 12:38)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

04.09.2012, 12:35

Der Destruktor der Basis kann ganz einfach durch einen Call aufgerufen werden am Ende des Konstruktors. Wenn der vtable also den ersten Aufruf zur am meisten abgeleiteten Klasse delegiert, dann kann danach ganz stink-normal am Ende des jeweiligen Konstruktors der der Basis-Klasse aufgerufen werden und diese Calls hangeln sich dann bis zur obersten Basisklasse durch.

Wenn du polymorph programmiers und willst das alle Destruktoren durchlaufen werden müssen diese virtuell sein.

Nope, nur wenn du Objekte über Basisklassenzeiger deleten willst.
Was er mit "polymorph" ja schon zum Ausdruck gebracht hat, denn sonst wäre es nicht polymorph. ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige