methoden überschreiben und stl container



  • ich bin eben auf ein problem gestoßen das will mir nicht in den kopf. ich habe eine basisklasse mit einer virtual methode. davon habe ich eine klasse abgeleitet und die virtul methode überschrieben. wenn ich jetzt das ganze in eine funktion geben die nur ein objekt der basis klasse erwartet, funktioniert alles trotzdem so wies soll (die funktion der abgeleiteten klasse wird aufgerufen)
    wenn ich das ganze jetzt in einen stl container (vector<base>) gebe, über einen iterator durchlaufe und die funktion aufrufe, ruft er nur die funktion der basis klasse auf... warum?

    hier noch ein kleines programm damit ihr wist was ich meine:

    #include <cstdlib>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class base
    {
    	public:
    		base() {};
    		~base() {};
    		virtual void hallo() { std::cout << "base sagt hallo" << std::endl; };
    };
    
    class inherited : public base
    {
    	public:
    		inherited() {};
    		~inherited() {};
    		void hallo() { std::cout << "inherited sagt hallo" << std::endl; };
    };
    
    void test(base& b1, base& b2)
    {
    	b1.hallo();
    	b2.hallo();
    
    	vector<base> vec;
    
    	vec.push_back(b1);
    	vec.push_back(b2);
    
    	vector<base>::iterator it;
    	for (it = vec.begin(); it != vec.end(); ++it)
    	    it->hallo();
    }
    
    int main(int argc, char *argv[])
    {
    	base b;
    	inherited i;
    	test(b, i);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    ausgeben sollte es eigentlich

    base sagt hallo
    inherited sagt hallo
    base sagt hallo
    inherited sagt hallo
    

    aber da er nur die base funktion aufruft kommt da:

    base sagt hallo
    inherited sagt hallo
    base sagt hallo
    base sagt hallo
    

    habt ihr da ne ahnung warum und wie ich das umgehen kann? liegt das vielleicht an den templates, dass kein "late binding" (steht da in dem buch) durchgeführt wird?

    mfg



  • Das liegt an deinem Vektor. bei push_back erstellst du ein neues Objekt des Types base.

    Gruß



  • oh mein gott bin ich blöd.... wie peinlich danke 🙂


Anmelden zum Antworten