Virtuelle Funktionen mit Template überschreiben?



  • Hallo!

    Warum scheint es nicht möglich zu sein, virtuelle Funktionen
    durch ein Funktions-Template zu überschreiben? Also:

    class CBase
    {
    public:
    	virtual void GetValue(int& X) = 0;
    	virtual void GetValue(double& X) = 0;
    };
    
    class CDerived : public CBase
    {
    public:
    	template <class T>
    	void GetValue(T& X) { }
    };
    

    CDerived ist immer noch abstrakt (obwohl das Template doch
    die virtuellen Basisfunktionen überdecken könnte).

    Und im Gegensatz zu virtuellen Template-Funktionen ist
    hier doch genau bekannt, welche Funktionen zu definieren sind.

    Alex



  • aus dem Selben Grund arum virtuelle Funktionen keine Templates sein dürfen



  • LionAM schrieb:

    class CBase
    {
    public:
        virtual void GetValue(int& X) = 0;
        virtual void GetValue(double& X) = 0;
    };
    
    class CDerived : public CBase
    {
    public:
        template <class T>
        void GetValue(T& X) { }
    };
    

    also so ist das klar dass das nicht funktioniert, da du die virtuelle funktion nicht überschreibst, denn bei virtuellen Funktionen müssen die Funktionsparameter gleich sein. Nur der Rückgabetyp kann unterschiedlich sein. bin mir nicht ganz sicher aber vielleicht könnte es so gehen:

    class CDerived : public CBase
    {
        public:
            template <class T>
            T GetValue(int& X) { }
    };
    

  • Mod

    LionAM schrieb:

    CDerived ist immer noch abstrakt (obwohl das Template doch
    die virtuellen Basisfunktionen überdecken könnte).

    Kein Konjunktiv. Und Überdeckung ist eben etwas anderes als Überschreiben.

    Und im Gegensatz zu virtuellen Template-Funktionen ist
    hier doch genau bekannt, welche Funktionen zu definieren sind.

    Woher?

    Eine Funktion überschreibt eine virtuelle Funktion einer Basisklasse, wenn sie die gleichen Parameter hat, die gleiche Qualifizierung hinsichtlich des Objektparameters besitzt und vor allem den gleichen Namen hat.

    CDerived::GetValue ist keine Funktion, sondern ein Template.
    CDerived::GetValue<int> ist zwar eine Funktion, aber ihr "Name" stimmt nicht mit dem der Basisklasse überein.



  • Danke für die Antworten!
    Ok, dass die Namen nicht übereinstimmen,
    ist ein Argument. Auch wenn ich der Meinung bin,
    dass außer der Definition des Standards nichts
    prinzipiell dagegen gesprochen hätte...

    Und im Gegensatz zu virtuellen Template-Funktionen ist
    hier doch genau bekannt, welche Funktionen zu definieren sind.

    Woher?

    Alle virtuellen Funktionen sind doch in CBase aufgeführt,
    und damit auch die vtable festgelegt.
    Und alle passenden Funktionen (gleiche Parameter), werden
    überschrieben. Es dürfte natürlich nicht von den bereits
    existierenden Funktionen, sondern zusätzlich auch von den
    durch ein Template erzeugbaren Funktionen ausgegangen werden.

    Aber wenigstens funktioniert es so:

    class CDerived : public CBase 
    { 
    public: 
        template <class T> 
        inline void GetValueT(T& X) { } 
    
        void GetValue(int& X) { GetValueT(X); } 
        void GetValue(double& X) { GetValueT(X); }
    };
    

    Alex


Anmelden zum Antworten