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
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
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.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include <iostream> class MyInterface { protected: // Boilerplate MyInterface() {} MyInterface(const MyInterface&) {} MyInterface& operator =(const MyInterface&) { return *this; } ~MyInterface() { std::cout << "MyInterface::~MyInterface\n"; } public: virtual void shakeItBaby() = 0; }; class ImplementationA : public virtual MyInterface { public: ~ImplementationA () { std::cout << "ImplementationA::~ImplementationA \n"; } void shakeItBaby() { std::cout << "D I S C O\n"; } }; void genericAlgorithm(MyInterface& stuff) { stuff.shakeItBaby(); } int main() { ImplementationA a; genericAlgorithm(a); } |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (04.09.2012, 13:13)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Kann mir mal einer einen Anwendungsfall nennen. Ich verstehe den Sinn eines protected destructors offenbar noch nicht.
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (04.09.2012, 13:31)
Die Möglichkeit Objekte zu deleten, betrachte ich als Teil des Interface eines Typs und wird durch einen public virtual Destruktor im Interface ausgedrückt. Ich persönlich find sowas aber eigentlich eher unsauber, da es massive Einschränkungen an die Implementierungen des Interface impliziert.
Z.B. muss nun sichergestellt sein, dass sämtliche Instanzen aller jemals abgeleiteter Typen ausschließlich nur mit new erzeugt werden, Stackallokation, selbst placement new, ein eigener Allocator etc. ist plötzlich keine Option mehr, Typen mit Wertsemantik können das Interface überhaupt rein prinzipiell nichtmehr implementieren...
Wenn du mein Beispiel oben betrachtest, fällt auf, dass ImplementationA sogar einen funktionierenden Kopierkonstruktor hat. Und das macht ja nichts, vielleicht macht es für Objekte vom Typ ImplementationA Sinn, sie zu kopieren. Das Interface ist in der Regel völlig unabhängig von solchen Dingen...
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Z.B. muss nun sichergestellt sein, dass sämtliche Instanzen aller jemals abgeleiteten Typen ausschließlich nur mit new erzeugt werden, Stackallokation (...) ist plötzlich keine Option mehr
Werbeanzeige