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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

29.09.2008, 20:58

Zitat von »"unsigned long"«


So als "Heilige Faustregel" kann man sagen: Wenn man von einer Klasse ableiten darf, Destruktor immer virtual.


Ergänzend zur "Heiligen Faustregel" sei noch zu sagen: Wenn man von einer Klasse ableiten darf sollte der Destruktor entweder virtuell oder nicht virtuell und geschützt (protected) sein.
@D13_Dreinig

Anonymous

unregistriert

12

29.09.2008, 21:06

David_pb
Ja okay, ich wollte das jetzt nicht so tief ins Detail springen lassen. Obwohl da du grade mal da bist, mal so eine Frage am Rande: Wenn der d'tor doch protected ist, kann dieser überhaupt dann noch von delete aufgerufen werden, wenn ich eine Basisklasse instanziiere?

delete dürfte doch dann keinen Zugriff darauf haben.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

29.09.2008, 21:09

Ja genau, das ist auch die Idee dahinter. Das nämlich sowas nicht erlaubt ist:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct A
{
protected:
  ~A() {}
};

struct B : A
{
   ~B() {}
};

// ...


A* ptrA = new B;
delete ptrA; // compiletime error...
@D13_Dreinig

Anonymous

unregistriert

14

29.09.2008, 21:12

David_pb
Gut dann ergänzen wir den Merksatz noch einmal:
Ein Destruktor einer Klasse sollte immer virtual sein, wenn von dieser abgeleitet werden darf und diese instanziiert werden darf. Ein Destruktor sollte protected oder virtual sein, wenn nur die abgeleiteten Klassen instanziiert werden dürfen, doch nicht die Basis-Klasse selbst.

:)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

15

29.09.2008, 21:22

Zitat

Aber es gibt virtuelle Methoden. Das bedeutet, dass eine abgeleitete Klasse Methoden der Basisklasse 'überschreiben' kann. Wenn wir nun unser Derived an die Funktion übergeben, wird nicht die virtuelle Methode von Base aufgerufen, sondern die neue von Derived.



Hö? war ich doch richtig... selbst wenn nicht, im inerin meines Herzens weiß ich die richtige Antwort :)

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

16

29.09.2008, 21:23

Hallo,
okay danke ^^
Ich werde noch prüfen ob ich alle Konstruktoren als virtual bezeichnet habe :)
Sonst könnte es bestimmt zu weiteren Fehlern kommen :/

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Anonymous

unregistriert

17

29.09.2008, 21:25

Zitat von »"T-VIRUS"«


Ich werde noch prüfen ob ich alle Konstruktoren als virtual bezeichnet habe :)
Destruktoren, nicht Konstruktoren.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

29.09.2008, 21:27

Zitat von »"Databyte"«

Zitat

Aber es gibt virtuelle Methoden. Das bedeutet, dass eine abgeleitete Klasse Methoden der Basisklasse 'überschreiben' kann. Wenn wir nun unser Derived an die Funktion übergeben, wird nicht die virtuelle Methode von Base aufgerufen, sondern die neue von Derived.



Hö? war ich doch richtig... selbst wenn nicht, im inerin meines Herzens weiß ich die richtige Antwort :)


Im Bezug auf virtuelles Ableiten sind die Zusammenhänge doch etwas anders (ich glaub auch nicht, dass du die richtige Antwort im Innersten deines Herzens kennst). :p
@D13_Dreinig

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

19

29.09.2008, 21:37

Zitat von »"David_pb"«

Zitat von »"Databyte"«

Zitat

Aber es gibt virtuelle Methoden. Das bedeutet, dass eine abgeleitete Klasse Methoden der Basisklasse 'überschreiben' kann. Wenn wir nun unser Derived an die Funktion übergeben, wird nicht die virtuelle Methode von Base aufgerufen, sondern die neue von Derived.



Hö? war ich doch richtig... selbst wenn nicht, im inerin meines Herzens weiß ich die richtige Antwort :)


Im Bezug auf virtuelles Ableiten sind die Zusammenhänge doch etwas anders (ich glaub auch nicht, dass du die richtige Antwort im Innersten deines Herzens kennst). :p


Und wie ?

( Und woher weißt du das ?^^)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

29.09.2008, 21:40

Zitat von »"Databyte"«


Und wie ?

( Und woher weißt du das ?^^)


Ich weiß es nicht, ich glaub es aber! Wie auch immer, das Thema ist ziemlich komplex und es soll an der Stelle genügen das der Poster sein Problem gelöst hat, oder?
@D13_Dreinig

Werbeanzeige