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 !!!