dynamic_cast
-
besten dank euch beiden für die promte hilfe!
es lag an der rtti, was mir bislang unbekannt war. was mich aber noch interessieren würde, was es in diesem zusammenhang für einen sinn hat den destruktor virtuell zu machen?
lenzoi
-
Der Destruktor von Basisklassen muss virtuell sein, weil sonst die Zerstörung von abgeleiteten Objekten lt. C++-Standard nicht definiert ist.
<edit> verbessert: Schreibfehler Ctor/Dtor </edit>
-
präziser: der destruktor von basiklassen muss virtuell sein, falls du ein objekt einer abgeleiteten klassen über einen pointer auf die basisklasse löschen willst (bin mir nicht ganz sicher - möglicherweise auch, falls ein temporary einer abgeleiteten klasse an eine referenz der basisklasse gebunden wird). andernfalls ist es nicht notwendig.
-
IMHO kann auf den dtor auch verzichtet werden wenn mindestens eine virtuelle Methode definiert wird, hauptsache die vtable wird initiiert...
-
LordJaxom schrieb:
IMHO kann auf den dtor auch verzichtet werden wenn mindestens eine virtuelle Methode definiert wird, hauptsache die vtable wird initiiert...
Gemäss Standard 5.3.5.5 kann wohl nicht darauf verzichtet werden.

-
LordJaxom schrieb:
IMHO kann auf den dtor auch verzichtet werden wenn mindestens eine virtuelle Methode definiert wird, hauptsache die vtable wird initiiert...
Gemäss Standard 5.3.5.3 kann wohl nicht darauf verzichtet werden.

-
Redhead schrieb:
LordJaxom schrieb:
IMHO kann auf den dtor auch verzichtet werden wenn mindestens eine virtuelle Methode definiert wird, hauptsache die vtable wird initiiert...
Gemäss Standard 5.3.5.3 kann wohl nicht darauf verzichtet werden.

stimmt doch gar nicht.
-
volkard schrieb:
Redhead schrieb:
LordJaxom schrieb:
IMHO kann auf den dtor auch verzichtet werden wenn mindestens eine virtuelle Methode definiert wird, hauptsache die vtable wird initiiert...
Gemäss Standard 5.3.5.3 kann wohl nicht darauf verzichtet werden.

stimmt doch gar nicht.
Wo siehst du da den Widerspruch.

-
Redhead schrieb:
volkard schrieb:
Redhead schrieb:
LordJaxom schrieb:
IMHO kann auf den dtor auch verzichtet werden wenn mindestens eine virtuelle Methode definiert wird, hauptsache die vtable wird initiiert...
Gemäss Standard 5.3.5.3 kann wohl nicht darauf verzichtet werden.

stimmt doch gar nicht.
Wo siehst du da den Widerspruch.

begründe mal deine aussage, das ist besser, als daß ich widersprüche suche, wo gar kein zusammenhang ist.
zur erinnerung:
Person* p = new Artist("phil","collins"); Artist* a = dynamic_cast<Artist*>(p);
-
Ich dachte dabei an folgendes Beispiel:
#include <iostream> using namespace std; class Person { public: Person() { cout << "Person()" << endl; }; ~Person() { cout << "~Person()" << endl; }; virtual dummy() { }; }; class Artist : public Person { public: Artist() { cout << "Artist()" << endl; }; ~Artist() { cout << "~Artist()" << endl; } }; int main() { Person* p = new Artist; Artist* a = dynamic_cast<Artist*>(p); delete p; return 0; }von wegen fehlendem virtual destructor von Person.
Hab ich (deiner Meinung nach) was überlesen/übersehen.

-
Redhead schrieb:
von wegen fehlendem virtual destructor von Person.
Hab ich (deiner Meinung nach) was überlesen/übersehen.
du hast lediglich
delete p;frei erfunden. ich dachte natürlich an gar kein delete. wozu auch? und wenn doch mal eins sein müßte, dann ein
delete a;du magst ja recht haben, wenn du meinst, daß ein virtueller destruktor vermutlich sinnvoll sein wird, wenn man betrachtet, wie das programm in einigen monaten ausgebau sein wird. aber dein
Gemäss Standard 5.3.5.3 kann wohl nicht darauf verzichtet werden.
klingt danach, als würde der standard hier was erzwingen, was er nicht tut. statt "Gemäss Standard 5.3.5.3" wäre was wie "damit delete p; geht" besser lesbar und korrekt. und der leser kann sich gleich aussuchen, ob er "delete p;" mag und deiner folgerung folgt oder ob er es nicht mag.
-
Ich hab den "Ausgangscode" nur für einen Teilausschnitt gehalten und gemutmasst
das da wo ein new steht auch irgendwann (hoffentlich) eine delete kommt.
:p 