Kann mir das mal jemand erklären: dynamic_cast bei abstrakten Basisklassen



  • Ich arbeite mich gerade mit Hilfe eines Buchs etwas in C++ ein aber beim letzten Kapitel hatte ich einige Verständnisprobleme, und zwar: da war die Rede von abstrakten Basisklassen - soweit hab ich noch alles verstanden. Jetzt wird von dieser Basisklasse eine neue Klasse "Derived" abgeleitet (alle virtual [...]=0 Methoden werden überschrieben) und einige Methoden werden zu dieser neuen Klasse hinzugefügt. Jetzt steht dort, dass wenn eine neue Methode der Klasse "Derived" nicht zu der Basisklasse passt, der Compiler meckern würde. Wenn man mit einem BasePtr auf die Klasse Derived zeigt muss man also eine dynamic_cast zu Derived machen.

    Jetzt verstehe ich nicht:

    1. Warum muss der cast hier erfolgen?
    2. Ist das nur bei abstrakten Basisklassen so?
    3. Und vor allem Wie entscheidet der Compiler ob die Methode zur Basisklasse passt???

    Vielen Dank für euere Bemühungen



  • Hallo,

    1. Weil die neue methode nur in der abgeleiteten Klasse existiert und du einen Pointer auf die Basisklasse hast. Du brauchst hier also einen Pointer auf die abgeleitete Klasse.
    2. Nein, Das ist auch bei nicht abstrakten Basisklassen so
    3. dynamic_cast liefert einen NULL-Pointer wenn die abgeleitete Klasse nicht passt.



  • @ Braunstein: ok vielen Dank soweit.

    noch eine andere Frage hätte ich: Im Buch wird das auch noch mit dem Destruktor und einem BasePtr erklärt. hier reicht ja der pointer auf die Basisklasse um den Destruktor von "Derived" aufzurufen, vorrausgesetzt er ist virtual, soweit noch richtig? dannach ist der destruktor von abgeleiteten Klassen im Buch allerdings in den Beispielen wieder nicht-virtuell. gibts dafür nen Grund bzw. sollte der Destruktur dann nicht allgemein virtuell sein?



  • Hallo

    hier reicht ja der pointer auf die Basisklasse um den Destruktor von "Derived" aufzurufen, vorrausgesetzt er ist virtual, soweit noch richtig?

    Ja das ist richtig.

    dannach ist der destruktor von abgeleiteten Klassen im Buch allerdings in den Beispielen wieder nicht-virtuell. gibts dafür nen Grund bzw. sollte der Destruktur dann nicht allgemein virtuell sein?

    Wenn eine Methode in einer Basisklasse erstmal virtuell ist, sind es auch alle überschriebenen in den abgeleiteten Klassen. Das betrifft auch den Destruktor. Ob du also in den abgeleiteten Klassen virtuell oder nicht davor schreibst, ist dem Compiler egal.

    bis bald
    akari



  • akari schrieb:

    Wenn eine Methode in einer Basisklasse erstmal virtuell ist, sind es auch alle überschriebenen in den abgeleiteten Klassen. Das betrifft auch den Destruktor. Ob du also in den abgeleiteten Klassen virtuell oder nicht davor schreibst, ist dem Compiler egal.

    ne die frage hat sich darauf bezogen dass der destruktor auch in class Base nicht virtuell ist. wie im kapitel zuvor beschrieben kann das allerdings zu problemen führen, deshalb die frage ob der destruktor in der basisklasse immer virtual sein sollte?



  • Hallo

    dann hast du dirch hier aber falsch ausgedrückt

    dannach ist der destruktor von abgeleiteten Klassen im Buch allerdings in den Beispielen wieder nicht-virtuell

    Der Destruktor der Basisklasse sollte immer virtuell sein. Wenn also eine Klasse dazu gedacht ist, abgeleitet zu werden, immer einen virtuellen Destruktor bereitstellen.

    bis bald
    akari


Anmelden zum Antworten