Стоит ли упоминать соглашения о вызовах в чисто виртуальных функциях? - PullRequest
0 голосов
/ 22 сентября 2018

Вот пример, IUnknown интерфейс из Unknown.h в Windows SDK:

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

interface IUnknown {
    CONST_VTBL IUnknownVtbl* lpVtbl;
};

Вы можете увидеть STDMETHODCALLTYPE перед виртуальными функциями, которые __stdcall (как правило).Итак, мой вопрос, важно ли упоминать соглашения о вызовах в чисто виртуальных функциях?Или соглашения о вызовах управляются внутри виртуальных функций с помощью параметров компилятора или компилятора (например, /Gz для __stdcall)?

Также, когда я не упоминаю никаких соглашений о вызовах перед виртуальными функциями в исходном коде (или с помощьюлюбой вариант компилятора), исполняемый файл работает нормально.

1 Ответ

0 голосов
/ 22 сентября 2018

Вам необходимо указать их.Тот факт, что вы вызываете функцию через (по существу) указатель на функцию, не имеет значения - вызывающая сторона и вызываемая функция должны согласовать такие вещи, как порядок передачи параметров.

Но почемуВам нужно указать их в базовом классе?

Ну, во-первых, я бы ожидал, что компилятор пожалуется, если вы этого не сделали, а во-вторых, вы можете вызывать указанные функции через объект или (более вероятно) указатель на объект указанного базового класса, и в этом случае объявления в базовом классе - это все, что нужно компилятору.

...