Vererbung - virtual function



  • Hallo,

    ich hab folgendes problem:
    ich habe einen vector mit meiner hauptklasse, in den objekte von deren subklassen gespeichert werden, nun will ich den vector mit einer print funktion ausgeben lassen, wobei auf die print funktion der subklassen zurückgegriffen werden soll, aber irgendwie klappt das nicht, vielleicht, kann mir ja jemand helfen das problem zu lösen...
    der quelltext ist ziemlich lang deshalb hab ich die files gepackt und hochgeladen, hier der link:
    http://www.4shared.com/file/251270222/34d0279d/Distribution.html

    am besten am anfang in der main.cpp nach unten zur print funktion hinscrollen
    dadadurch sollte das problem deutlicher werden.

    ach, c builder hat mir folgende fehlermeldung ausgegeben:

    [ILINK32 Fehler] Error: Nicht auflösbares externes 'Distribution::print()' referenziert von C:\...\RAD STUDIO\PROJEKTE\DEBUG\CDISTRIBUTION.OBJ
    [ILINK32 Fehler] Error: Linken kann nicht ausgeführt werden

    danke schonmal für die hilfe



  • Dein Linker beschwert sich, dass er ein symbol nicht finden kann.
    Entweder hast du Distribution::print() nicht implementiert (oder falsch implementiert), oder die Datei die die Implementierung enthält, nicht hinzugelinkt.

    Und den Download tu ich mir nicht an. Auf so adverseuchten Seiten ewig zu warten, nö, nur um dir deinen Source zu debuggen - da hab ich besseres zu tun 😉

    Poste doch einfach hier die Klassendefinition von Distribution und wie du Distribution::print implementierst, wenn du absolut nicht weiterkommst.



  • Distribution.h:

    #ifndef DESTRIBUTION.h
    #define DESTRIBUTION.h
    #include <string>
    
    using std::string;
    
    class Distribution
    {
    	private:
    		string title, type;
    		double price;
    	public:
    		void setTitle(string title);
    		void setPrice(double price);
    		void setType(string type);
    		string getTitle();
    		double getPrice();
    		string getType();
    		virtual void print();
    		Distribution(string type = "none");
    };
    
    #endif
    

    print ist leer in der implementation.. und nur in den subklassen richtig mit inhalt implementiert



  • Nickolaus schrieb:

    print ist leer in der implementation.. und nur in den subklassen richtig mit inhalt implementiert

    Was heißt leer?
    Für sowas gibt es eigentlich pure virtual - wenn die Subklassen das implementieren müssen.


  • Administrator

    Nickolaus schrieb:

    print ist leer in der implementation.. und nur in den subklassen richtig mit inhalt implementiert

    Dann musst du aber die Deklaration so schreiben:

    virtual void print() = 0;
    

    Sonst wird erwartet, dass eine Implementierung vorliegt.

    Grüssli



  • Wenn Du aus Distribution eine abstrakte Klasse machen willst (das willst Du, denn Du willst kein Distribution::print vorgeben) musst Du sie auch "pur virtuell" machen. Das geht mit der "=0;"-Sytnax. Zeig auch ruhig mal den Rest vom Code ... zB was für ein Typ der vector hat.

    Du weißst, dass die Kontainer aus der Standardbibliothek Kopien speichern und was Slicing ist, ja? (rethorische Frage, soll zum Nachforschen anregen)



  • ja, danke ok, hab ich verstanden,..
    gibt es denn ne möglichkeit, wie ich die verschiedenen objecte der subklassen in einen vector oder änliches zu packen,
    vector<Distribution> geht ja nun nicht mehr, da die klasse jetzt abstrakt ist



  • Nickolaus schrieb:

    ja, danke ok, hab ich verstanden,..
    gibt es denn ne möglichkeit, wie ich die verschiedenen objecte der subklassen in einen vector oder änliches zu packen,
    vector<Distribution> geht ja nun nicht mehr, da die klasse jetzt abstrakt ist

    Basisklassenpointer:
    vector<Distribution *>

    // edit:
    Dafür kannst du dir auch mal die boost.ptr_container anschauen.



  • vielen dank für die hilfe, werd mir den genauer anschauen sobald ich dafür zeit hab,... denke ich kann meine probleme nun wohl lösen, muss die sache zwar jetzt wieder nen bisschen umschreiben, aber wird schon schiefgehen...

    wie gesagt vielen dank nochmal für die schnelle unterstützung


Anmelden zum Antworten