Frage zu Virtuellen Funktionen



  • Hi,

    ich habe ein Problem mit virtuellen methoden in C++:

    Ich habe eine Liste vom typ list<Fahrzeuge> p_ptFahrzeuge.
    In dieser liste möchte ich zeiger auf Objekte vom Typ Fahrzeug, PKW und Fahrrad speichern.
    PKW und Fahrrad sind von Fahrzeug abgeleitet.

    Nun passiert folgendes:
    Wenn ich nun der Liste einen Zeiger vom Typ PKW hinzufüge, dann ist das Objekt danach vom Typ Fahrzeug.
    Nun habe ich aber in Fahrzeug eine Methode vAbfertigung als virtuell deklariert und in PKW sowie Fahrrad
    überschrieben. Leider kann ich die vAbfertigung von der Klasse PKW nicht mehr von einem Zeiger der Liste
    aufrufen, sondern nur die Methode in der Klasse Fahrzeug.

    Es muss doch einen Weg geben, das in den Griff zu bekommen.

    Vielen Dank für alle Antworten



  • Polymorphie löst das Problem von alleine - allerdings speicherst du in der Liste Fahrzeuge statt Zeiger auf Fahrzeuge. Polymorphie funktioniert aber nur mit Zeigern.

    vector<Fahrzeug*> fzs;
    fzs.push_back( new PKW() );
    
    fzs[0]->doSmth(); // PKW.doSmth()
    
    // deleten aller mit new im vector platzieren elemente nicht vergessen!
    

    MfG SideWinder



  • entweder versteh ich dein problem falsch oder du verstehst nicht was virtuelle funktionen sind...es ist ja gerade der sinn von virtuellen funktionen, dass Fahrzeug->vAbfertigung() eben nicht Fahrzeug->vAbfertigung(), sonder PKW->vAbfertigung() etc., also eben "das richtige" macht...

    EDIT:

    ok hat ja schon wer beantwortet. das mit der liste hab ich übersehen...wie schon gesagt wurde, du musst mit zeigern oder referenzen arbeiten damit das geht.



  • Danke SideWinder. Das war der Grund. Es läuft einwandfrei.
    So ein Mist. Ein kleines Sternchen vergessen und 3 Stunden für blöde Fehlersuche draufgegangen.

    Nochmals danke.



  • Jinzuu schrieb:

    Das war der Grund. Es läuft einwandfrei.
    So ein Mist. Ein kleines Sternchen vergessen und 3 Stunden für blöde Fehlersuche draufgegangen.

    Das wäre nicht passiert, wenn du dich an Scott Meyers' Rat "Make non-leaf classes abstract" gehalten hättest. In diesem Fall wäre ein Container<Fahrzeug> gar nicht erst möglich und das resultierende (aber ungewollte) Slicing könnte nicht auftreten. Und wenn man Basisklassen mal nicht abstrakt macht, dann sollte man zumindest das Kopieren per Default verbieten.


Anmelden zum Antworten