首页 > 解决方案 > 我应该提到纯虚函数中的调用约定吗?

问题描述

这是一个示例,来自Windows SDK 中的IUnknown 接口:Unknown.h

IUnknown {
    public:
        virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
                REFIID riid,
                void** ppvObject) = 0;
        //AddRef
        //Release
};
typedef struct IUnknownVtbl {
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUnknown* This,
        REFIID riid,
        void **ppvObject);
    //AddRef
    //Release
} IUnknownVtbl;

interface IUnknown {
    CONST_VTBL IUnknownVtbl* lpVtbl;
};

您可以STDMETHODCALLTYPE在虚拟功能之前看到__stdcall(通常)。那么,我的问题是,在纯虚函数中提及调用约定重要吗?或者调用约定是由编译器或编译器选项(例如/Gzfor __stdcall)在虚拟函数中内部管理的?

此外,当我在源代码中的虚拟函数(或任何编译器选项)之前没有提及任何调用约定时,可执行文件可以正常工作。

标签: c++windowscomcalling-convention

解决方案


您需要指定它们。您通过(基本上)函数指针调用函数这一事实没有任何区别 - 调用者和被调用的函数仍然需要就参数传递的顺序等事项达成一致。

但是为什么需要在基类中指定它们呢?

好吧,首先我希望编译器会抱怨,如果您没有这样做,其次您可能会通过对象或(更有可能)指向所述基类的对象的指针调用所述函数,在这种情况下,基类中的声明是所有的编译器都必须继续。


推荐阅读