Unterschied: virtuell und rein virtuell



  • Hello,

    habe ich das richtig verstanden?

    Als virtuell deklarierte Methoden dienen dazu, ihnen in abgeleiteten Klassen
    ein neues Verhalten zuzuordnen.( virtual void method(void); )

    Rein virtuelle Methoden dienen dazu, um von Basisklassenzeigern aus auf
    Methoden der abgeleiteten Klassen zugreifen zu können
    (virtual void method(void) = 0; ). Ausserdem auch dazu, um in Ableitungs-
    hirarchien den entsprechenden Dekonsturktor aufzurufen.

    Bit ergänzt oder korriegiert mich, wenn ich daneben liege!

    Danke schon mal im Voraus!



  • Hallo

    Der Unterschied zwischen virtuell und rein virtuell ist auschließlich das rein virtuelle Methoden von der ableitenden Klasse überschrieben werden müßen und die Basisklasse abstrakt wird.

    bis bald
    akari



  • edit: @curry-king
    Naja, nicht ganz. Virtuelle Methoden können überschrieben werden, rein virtuelle müssen letztendlich (um die Klasse instanziieren zu können) überschrieben werden. Ausgeführt wird immer die Implementation des tatsächlichen Typs.



  • Ich weiß, das finix das Richtige meint, aber:

    Das die Implementation des tatsächlichen Typs ausgeführt wird, gilt nur für Zeiger. (finix käme, wie ich, gar nicht erst auf die Idee, einen abgeleiteten Typ gezielt in einen Basistyp zu casten, deswegen dachte ich, ich stelle es nochmal klar).

    [code]
    Basistyp* Schmidt;
    Abgeleitet* Dr = new Abgeleitet();
    Schmidt = Dr;
    Schmidt->doMethod(); // ruft Abgeleitet.doMethod() auf
    ...
    Basistyp Schmidt;
    Abgeleitet Dr; // Au!
    Schmidt = (Basistyp)Dr; // Au!!
    Schmidt.doMethod(); // Au!!!



  • @Sid: Klar könnte man auch Stack-Objekte anlegen, die virtuelle Methoden besitzen. An der Stelle kommt dann der Unterschied "statischer Typ" und "dynamischer Typ" zum Tragen (und eventuell Slicing-Probleme, wenn du innerhalb der Klassenhierarchie umwandelst)

    Sik2k7 schrieb:

    Basistyp Schmidt;
    Abgeleitet Dr; // Au!
    Schmidt = (Basistyp)Dr; // Au!!
    Schmidt.doMethod(); // Au!!!

    Abgesehen von der Zuweisung (Probleme mit Slicing) läuft der Code doch ganz normal ab (und ist in C++ so auch völlig legal).



  • Nope, denn Basistyp Schmitt erzeugt eine Instanzierung eines abstraken Datentyps -> illegal.



  • Michael E. schrieb:

    Nope, denn Basistyp Schmitt erzeugt eine Instanzierung eines abstraken Datentyps -> illegal.

    Genau. Jetzt fehlt nur noch ein Kommentar für den Fall dass Basistyp nicht abstrakt ist...



  • finix schrieb:

    edit: @curry-king
    Naja, nicht ganz. Virtuelle Methoden können überschrieben werden, rein virtuelle müssen letztendlich (um die Klasse instanziieren zu können) überschrieben werden. Ausgeführt wird immer die Implementation des tatsächlichen Typs.

    Das hilft mir schonmal sehr weiter!


Anmelden zum Antworten