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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

16.08.2009, 09:42

Zitat von »"xardias"«

Ich dachte es ist nötig Destruktoren in Klassenhierachien virtuell zu definieren, da diese sonst evtl nicht alle aufgerufen werden.


Das ist nur nötig wenn du ein abgeleitetes Objekt über einen Basisklassenzeiger deleten willst sonst nicht,

Zitat von »"xardias"«

Zum Zeitpunkt des Destruktoraufrufs ohne nicht erkennbar ist ob bei
B* instance = new B();
delete (A*)instance;
auch der Destruktor von B aufgerufen werden soll.


Doch, der Destruktor von A ruft den Destruktor von B auf. Ohne den cast nach A* wärs aber undefiniert.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

12

16.08.2009, 10:15

@dot ich glaube in dem Beispiel gilt class B : A
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

16.08.2009, 10:23

Zitat von »"Nox"«

@dot ich glaube in dem Beispiel gilt class B : A


Aso, ja das wär nur logisch xD

Dann braucht man in dem Beispiel natürlich nen virtuellen Dtor...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

16.08.2009, 11:49

Zitat von »"xardias"«


Zum Zeitpunkt des Destruktoraufrufs ohne nicht erkennbar ist ob bei
B* instance = new B();
delete (A*)instance;
auch der Destruktor von B aufgerufen werden soll.


Du kannst das unterbinden in dem du den d'tor von A schützt. Zusammenfassend: Der Konstruktor einer Basisklasse soll entweder nicht virtuell und protected oder virtuell sein.

15

16.08.2009, 17:24

Zitat von »"xardias"«

Ich dachte es ist nötig Destruktoren in Klassenhierachien virtuell zu definieren, da diese sonst evtl nicht alle aufgerufen werden.
Nicht grundsätzlich in Klassenhierarchien, sondern nur, wenn Polymorphie erwünscht ist. Vererbung impliziert nicht Polymorphie, man braucht diese längst nicht immer.

Zitat von »"xardias"«

Kann man natürlich handhaben wie man will, aber ich persönlich möchte bei der Nutzung der Klasse nicht darauf achten welche Methoden ich jetzt virtual gemacht habe und welche nicht.
Falls ich Polymorphie nutzen möchte, deklariere ich Methoden, die überschrieben werden (inklusive Destruktor), natürlich auch virtuell. Wenn ich später plötzlich andere Memberfunktionen auch noch überschreiben möchte, hole ich das nach. Aber präventiv virtual hinschreiben mach ich eigentlich nie (ausser eine Überschreibung ist wirklich vorgesehen).

Zitat von »"David_pb"«

Zusammenfassend: Der Konstruktor einer Basisklasse soll entweder nicht virtuell und protected oder virtuell sein.
Du meinst sicher Destruktor. Aber auch hier würde ich nicht verallgemeinern. Eventuell will man ja nur Objekte der Basisklasse (sofern diese nicht abstrakt ist).

Das Aufrufen von nicht-virtuellen, aber trotzdem neu definierten Funktionen über einen Basisklassenverweis resultiert übrigens nicht per se in undefiniertem Verhalten. Es wird eben die Funktion der Basisklasse aufgerufen (Slicing). Undefiniert wird es, wenn es sich um den Destruktor handelt und nur das halbe Objekt zerstört wird, oder falls in der Funktion selber irgendwelche Anweisungen stehen, die sich darauf verlassen, dass das aufrufende Objekt komplett ist und sich nicht noch eine abgeleitete Klasse dahinter versteckt.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

16.08.2009, 17:40

Zitat von »"Nexus"«


Zitat von »"David_pb"«

Zusammenfassend: Der Konstruktor einer Basisklasse soll entweder nicht virtuell und protected oder virtuell sein.
Du meinst sicher Destruktor. Aber auch hier würde ich nicht verallgemeinern. Eventuell will man ja nur Objekte der Basisklasse (sofern diese nicht abstrakt ist).


Richtig, ich mein natürlich Destruktor. Das mit dem verallgemeinern ist so ne Sache. Im Grund stimm ich dir zu, dass man so Dinge nicht verallgemeinern sollte, aber dann war da noch diese Sache mit: Bibliotheken sollten immer so designed werden, dass sie leicht richtig und schwer falsch zu verwenden sind. Und da kann man auf diese "Guideline" zurückgreifen, die Sutter mal zusammenfassend formuliert hat.

Werbeanzeige