polymorphie



  • guten tag,

    #include <iostream>
    #include <string>
    
    class container_base
    {
    public:
    	virtual std::string get_separator(void) { return "foobar";}
    };
    
    class protocol : public container_base
    {
    public:
    	std::string get_separator(void) { return "//"; }
    
    };
    
    class domain : public container_base
    {
    public:
    	std::string get_separator(void) { return "."; }
    
    };
    
    class referer : public container_base
    {
    public:
    	std::string get_separator(void) { return "/"; }
    };
    
    class querystring : public container_base
    {
    public:
    
    };
    
    int main()
    {
    	protocol p;
    	domain d;
    	referer r;
    	querystring q;
    
    	container_base x[4];
    
    	x[0] = p;
    	x[1] = d;
    	x[2] = r;
    	x[3] = q;
    
    	std::cout << std::endl;
    
    	for(int i = 0; i < 4; i++)
    		std::cout << "   " << x[i].get_separator() << std::endl;
    
    	std::cout << std::endl;
    	return 0;
    }
    

    dieses stück lässt sich einwandfrei kompilieren, trotzdem führt es nicht zu dem gewünschten ziel. ich hab ein array vom typ container_base, welches als container klasse dient um andere klassen zusammenzufassen.
    in die klasse container_base wurde eine virutelle methode get_separator() implementiert, die einfach ein zeichen bzw eine zeichenfolge ausgeben soll.
    nunja, die ausgabe des programms ist viermal foobar. das war nicht so beabsichtigt :). könnte ihr mir weiterhelfen?

    gruß



  • stichwort: slicing

    du führst eine Wert-Kopie durch

    x[0]=p;

    dadurch wird p kopiert. Und zwar in ein container_base. Dadurch verliert es aber seinen ursprünglichen Typen, es wird ja eine Kopie vom Typ container_base erstellt.

    Du brauchst für dynamische Polymorphie Referenzen oder Zeiger.



  • hi,

    danke dir, es funktioniert.
    hab alle instanzen allokiert und das array zum zeigerarray modifiziert.

    gruß



  • std::string get_separator(void) { return "//"; }
    

    bei dem gehört aber normalerweise noch ein

    virtual
    

    davor, weil in der basisklasse die methode auch virtuel war.



  • DEvent schrieb:

    std::string get_separator(void) { return "//"; }
    

    bei dem gehört aber normalerweise noch ein

    virtual
    

    davor, weil in der basisklasse die methode auch virtuel war.

    Kann man zwar machen, aber wird nicht benötigt !!!


Anmelden zum Antworten