gpt4 book ai didi

c++ - 可以通过跨二进制边界传递的对象上的接口(interface)调用虚函数吗?

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:28 24 4
gpt4 key购买 nike

给定这个界面:

struct ISomething
{
virtual void __stdcall DoSomething() = 0;
};

即使编译设置不同,应用程序能否安全地对从 dll 或共享对象返回的具体对象调用 DoSomething

(假设 __stdcall 在非 Visual Studio 编译器上为 #defined 为空。)

最佳答案

当您说“对象”时,您实际上指的是指向相关对象的指针吗?我假设是这样,因为由于纯粹的虚拟声明,您很可能无法创建 ISomething。

所以如果你的意思是:

ISomething* pObj = SomeAPICallToGetAnObject();
pObj->DoSomething();

那么只要调用者和实现者都同意调用约定、结构化参数的打包(如果有的话)等,它就会起作用。所述约定是基于声明的,并且由实现者+调用者按契约(Contract)执行。如果您未能将其定义为声明性合约的一部分,就会发生令人讨厌的事情。

这样的事情在实践中常见吗?绝对地。我经常使用的所有 WIN32 api 代码的整个 COM 端肯定不是使用我经常使用的相同的各种编译设置编译。但是我从 header decls 获得的契约(Contract)确保我使用正确的约定来使其工作。事实上,这些声明确保我的编译同意使调用成功的要求。

希望我没有误解你的问题。

关于c++ - 可以通过跨二进制边界传递的对象上的接口(interface)调用虚函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com