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::string statt char* und std::stringstream statt sprintf() , 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 🙄


Anmelden zum Antworten