Variable Parameterliste - seltsames Beispiel



  • Hi zusammen,

    ich grabe hier in einem Projekt herum, und in einer Klasse desselben fand ich folgenden, etwas seltsamen, Code:

    HRESULT CSerializerSrv::CallMethod(PVOID pvObject, VARIANT& vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...)
    {
    	UNUSED_ALWAYS(eVarType);
    	va_list args;
    	va_start(args, pszGUID);
    	return CallMethod(pvObject, vtRet, pszMethodName, pszGUID, args);
    }
    

    Was mich irritiert ist der Aufruf von CallMethod IN CallMethod, und das fehlende va_end Makro, das wohl auch dort vorhanden sein sollte, oder?

    Die zugehoerige Klassendefinition ist folgende:

    class ISerializer : public IConfigurable
    {
    public:
    	// !!!Important !!! The last argument must be VT_EMPTY, identifying vaarg list end
    	/* ... */
    	virtual HRESULT CallMethod(PVOID pvObject, VARIANT& vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...) = 0;
    	virtual HRESULT CallMethod(PVOID pvObject, VARIANT& vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, va_list args) = 0;
    	/* ... */
    };
    
    class CSerializerSrv :
    	public ISerializer,
    	public ILoggerCallback
    {
    public:
    	/* .... */
    	virtual HRESULT CallMethod(PVOID pvObject, VARIANT& vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...);
    	/* .... */
    };
    

    Kann mir jemand erklaeren, welche Methode jetzt mit dem Aufruf von CallMethod in der Methode CallMethod aufgerufen wird? Es sollte ja die der Basisklasse sein, oder? Leider ist diese gerade so virtuell genug, dass das so irgendwie nicht funktionieren kann ... . Und warum kann man das va_end einfach weglassen?

    Gruesse, ein Frohes Neues Jahr und Danke schon mal,

    Axel.


  • Mod

    es wird der entsprechende override (da die funktion virtuell ist) der zweiten virtuellen memberfunktion (der ohne ellipse) aufgerufen.



  • Und normalerweise sollte sich dein Compiler auch beschweren, wenn deine eigene Klasse keine Version dieser Methode zur Verfügung stellt (mindestens eine Warnung wegen überdeckter Funktionsdefinition).

    (und anschließend sieht es so aus, als ob diese Methode sich auch um den Aufruf des va_end kümmern muß)



  • CStoll schrieb:

    (und anschließend sieht es so aus, als ob diese Methode sich auch um den Aufruf des va_end kümmern muß)

    Und genau das macht sie nicht, genaugenommen kommt va_end im ganzen Projekt nicht einmal vor ... . Weiss jemand, ob das evtl. ein Memory-Leak verursachen kann?


Anmelden zum Antworten