Virtual Funktion wird aus der Basisklasse ausgerufen
-
Hi, ich habe eine Basisklasse "Object" und davon eine abgeleitete "Int16".
Jetzt versuche ich die in Int16 überschriebene Funktion aufzurufen.Hier der Code ...
Int16 bla = 100; String blabla = "Hundert = "; blabla += bla; printf("%s\n", blabla.Buffer());Die Ausgabe ...
Hundert = {Object}
Hier die Anwendung ...
void Append(Object a) { buffer = strcat(buffer, a.GetString()); Secure(); }; void operator += (Object a) { Append(a); };Hier die Basis ...
class Object { public: virtual char* GetString(void) { return (char*)"{Object}"; }; };Hier Int16 ...
char* GetString(void) { char* target = new char[6]; sprintf(target, FORMATTER, buffer); return target; };Ich würde gerne wissen, warum der nicht die überschriebene Version von GetString aufruft, sondern die aus der Basisklasse -.-
Complier ist G++
MFG
-
Weil der Parameter von operator+= und Append ein einfaches Object ist. Polymorph sind nur Referenzen und Zeiger.
-
Du musst eine Referenz oder einen Zeiger übergeben, da dynamische Polymorphie mit Objekten nicht direkt funktioniert (bzw. ist die übergebene Instanz immer vom Typ
Object; es wird automatisch upgecastet.Übrigens solltest du in C++ vom C-Rumgefrickel wegkommen. Und Funktionen brauchen kein Semikolon am Ende des Blocks.
-
void Append(Object& a) { buffer = strcat(buffer, a.GetString()); //& vergessen Secure(); }; void operator += (Object& a) //& vergessen { Append(a); };PS: Der Code ist gruselig.

-
Ha! Endlich mal vor Tachyon gepostet (und seien es nur 5 Sekunden).

Der Code ist wirklich gruselig. Nimm
std::stringstattchar*undstd::stringstreamstattsprintf(), dann bist du C++ schon ein bisschen näher.
-
Das ging jetzt aber echt flott

Ich versteh aber irgendwie nich was daran gruselig ist
die std::sachen hätt ich wirklich nehmen können, muss ich zugeben