c++ - 我应该提到纯虚函数中的调用约定吗?
问题描述
这是一个示例,来自Windows SDK 中的IUnknown 接口:Unknown.h
- 在 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
for __stdcall
)在虚拟函数中内部管理的?
此外,当我在源代码中的虚拟函数(或任何编译器选项)之前没有提及任何调用约定时,可执行文件可以正常工作。
解决方案
您需要指定它们。您通过(基本上)函数指针调用函数这一事实没有任何区别 - 调用者和被调用的函数仍然需要就参数传递的顺序等事项达成一致。
但是为什么需要在基类中指定它们呢?
好吧,首先我希望编译器会抱怨,如果您没有这样做,其次您可能会通过对象或(更有可能)指向所述基类的对象的指针调用所述函数,在这种情况下,基类中的声明是所有的编译器都必须继续。
推荐阅读
- reactjs - 如何在反应草稿所见即所得中设置初始编辑器状态
- android-studio - 在片段内实现 BottomSheet
- bash - CENTOS apache ALL=(root) NOPASSWD: /path/to/shell.sh 不工作
- node.js - NodeJS/PostgreSQL 错误
- ruby-on-rails - 使用 rspec 测试 API 端点
- javascript - Discord.js:reaction.js 事件文件未触发
- go - GO“ozzo-validation”中的验证
- c - 如何制作一个数组以将数据发送到 AVR 中的从机
- django - 重用分页和过滤 Django 中的旧选项
- python - 如何平滑深度学习模型中的准确率和损失曲线