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

04.09.2012, 12:36

Ganz genau so funktioniert das.

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

12

04.09.2012, 12:40

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.



Das genau ist doch polymorph programmieren !!! ;)
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

04.09.2012, 12:41

Das genau ist doch polymorph programmieren !!! ;)


Nein! Du kannst nur keine Objekte über einen Basiszeiger löschen.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

04.09.2012, 12:42

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.



Das genau ist doch polymorph programmieren !!! ;)

Nö, Polymorphie bedeutet weit mehr als Objekte über Basisklassenzeiger zu deleten. Das braucht man meiner Erfahrung nach vergleichsweise selten...

idontknow

unregistriert

15

04.09.2012, 12:44

Okey das war oben blöd formuliert, wenn ich den Destruktor virtual mache, dann funktioniert es natürlich immernoch gleich, wenn ich den Destruktor der abgeleiteten Klasse aufrufe. Und durchs vtable zeigt der "Destruktor der Basis" auf den Destruktor der abgeleiteten Klasse die wiederum den Destruktor der Basis aufruft. Ist ja gar nicht so wild das ganze :P

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

04.09.2012, 12:48

Das braucht man meiner Erfahrung nach vergleichsweise selten...

Echt? Wieso das? Wenn ich eine Menge von Instanzen polymorph halte und die löschen will, da komme ich doch gar nicht groß rundrum.
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]

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

17

04.09.2012, 12:52

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.



Das genau ist doch polymorph programmieren !!! ;)

Nö, Polymorphie bedeutet weit mehr als Objekte über Basisklassenzeiger zu deleten. Das braucht man meiner Erfahrung nach vergleichsweise selten...


Polymorph arbeitest du genau dann wenn du einem Zeiger einer Basisklasse auf ein Objekt einer abgeleiteten Klasse zeigen läßt und das Verhalten der abgeleiteten Klasse ganz oder in Teilen erhalten bleibt. Darunter fällt unter anderem auch das Verhalten beim Zerstören.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

stef

Treue Seele

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

18

04.09.2012, 12:55


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...


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
24
25
26
27
28
// setbase example
#include <iostream>
#include <iomanip>
using namespace std;

class Base
{
protected:
  /*virtual*/  ~Base()
  {
    printf("Base::~Base\n");
  }
};

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

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



Fehler 1 error C2248: "Base::~Base": Kein Zugriff auf protected Member, dessen Deklaration in der Base-Klasse erfolgte. d:\entwicklung\test_console_2008\test_console_2008\test.cpp 27 Test_Console_2008
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

19

04.09.2012, 12:55

Darunter fällt unter anderem auch das Verhalten beim Zerstören.


Aber nur unter anderem. Aber da du ohnehin virtuelle Methoden verwendest, könntest du den Destruktor vermutlich auch virtuell machen.

Zitat


Fehler 1 error C2248: "Base::~Base": Kein Zugriff auf protected Member, dessen Deklaration in der Base-Klasse erfolgte. d:\entwicklung\test_console_2008\test_console_2008\test.cpp 27 Test_Console_2008


Genau, das will man durch einen geschützten Destruktor haben.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

04.09.2012, 12:58

Das braucht man meiner Erfahrung nach vergleichsweise selten...

Echt? Wieso das? Wenn ich eine Menge von Instanzen polymorph halte und die löschen will, da komme ich doch gar nicht groß rundrum.

Ja und irgendwie fallen die wenigsten meiner Typen in diese Kategorie... ;)

Werbeanzeige