Poloymorphismus + zugriff auf abgeleitete "Klassenvariablen"



  • Original erstellt von Quatschkopp:
    **
    Wenn ich jetzt mit temp->attribut/Methode() auf eine Methode bzw. Attribut zugreifen will, kann ich nur auf die Methoden der Superklasse zugreifen.
    **

    Polymorphismus ist in C++ mit dem Schlüsselwort 'virtual' implementiert.

    struct base {
       virtual void foo () { /*base::foo*/ }
       void bar () { /*base::bar*/ }
       virtual ~base () {} //Destruktoren virtual machen, da sie immer aufgerufen werden (sollten)
    };
    
    struct derived : base {
       void foo /*virtual ist überflüssig*/ () { /*derived::foo*/ }
       void bar () { /*derived::bar*/ } //ist nur eine überdeckung!
    };
    
    int main () {
       base *b = new derived;
       b->foo (); //ruft derived::foo auf! (wegen virtual)
       b->bar (); //ruft base::bar auf (ist ja nicht virtual!)
       delete *b; //wenn der dtor nicht virtual wäre, würde nur base::~base und niemals derived::~derived aufgerufen werden!
    }
    

    **
    @cd9000
    wenn ich das mit dynamic_cast mache kommt folgende Fehlermeldung:
    error C2683: dynamic_cast : 'CFeld' ist kein polymorpher Typ
    feld.h(9) : Siehe Deklaration von 'CFeld'
    Was muss ich machen, damit das funktioniert.

    Danke, Stefan**

    Um dynamic cast zu nutzen, musst du mindestens eine virtuelle Methode deklarieren(auch definieren?) (ein vtable muss angelegt sein, sonst ermittelt dynamic_cast den falschen Typ)

    und nicht vergessen: destruktor der basisklasse virtuell machen!

    [ Dieser Beitrag wurde am 08.05.2003 um 20:31 Uhr von davie editiert. ]

    [ Dieser Beitrag wurde am 08.05.2003 um 20:32 Uhr von davie editiert. ]



  • Ok danke,

    ich hoffe, dass ich es damit hinbekomme. Ansonsten melde ich mich nochmal.

    Viele Grüße

    Stefan



  • Ok, klappt jetzt alles!

    Nur nochmal eine Frage. Ist es nicht doof, wenn ich eine Superklasse habe,mit den virtuellen abstrakten Funktionen. Von der leite ich ca. 5 Klassen ab. Dann muss ich ja, wenn ich die Funktionen nur in einer Klasse brauche, die Fkt. in den anderen Klassen leer implementieren! Oder?

    MFG Stefan



  • virtuell != virtuell abstrakt

    Wenn eine Memberfunktion nur virtuell ist, aber nicht abstrakt, benutzen die abgeleiteten Klassen die Funktion der Basisklasse, solange diese nicht in der abgleiteten Klasse überschrieben wird.



  • Acho,

    ich dachte auch virtuelle Methoden müssen immmer überschrieben werden!
    Ist OK!

    MFG Stefan



  • CFeld braucht auf jeden fall ein virtulen destuktor
    wenn du nämlich so was machst

    CFeld * p = new CStartfeld();
    delete p;
    

    wird nur der dtor von CFeld aufgerufen aber wir haben hier ein CStartfeld objekt



  • Jo, ich habe alle Detruktoren von Klassen, wo ich ableite, virtuell deklariert. 🙂



  • Original erstellt von cd9000:
    Lass das C vor dem Klassennamen weg. Wieso? -> Suchfunktion

    Warum hört nur keiner auf mich? 😞



  • @ cd9000

    sorry, dann muss ich meine ganzen Klassen ändern.
    Habe bei der Suchfunktion nichts gefunden. Sag mir doch mal warum!

    MFG



  • Der Thread liegt im "Rund um..." Forum und nicht hier:
    7 Seiten Diskussion über Klassenprefix


Anmelden zum Antworten