首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口(抽象类)与其他虚拟更改的ABI兼容性

接口(抽象类)与其他虚拟更改的ABI兼容性
EN

Stack Overflow用户
提问于 2011-09-13 08:30:52
回答 2查看 1.7K关注 0票数 3

类视图的ABI是否保持稳定,即使在派生类中进行了其他涉及虚拟化的更改?

也就是说,我有一个接口InterfaceA (包含许多纯虚拟函数的抽象类)和一个继承自它的类DerivedB。我编写了一个库,其中包含一个接受InterfaceA *的函数。我想知道的是,只要接口本身不改变,接口是否保持二进制兼容。

显然,如果我修改InterfaceA,我不希望代码是二进制兼容的。但是,如果我只是修改DerivedB,比如说继承更多的接口或添加其他虚拟函数,该怎么办?最极端的说法是,我从另一个定义InterfaceA的类中继承。尽管有所有这些更改,InterfaceA仍然保持二进制兼容吗?

到目前为止,我的假设和经验是,是的,它是相容的。我只是想确认这一点(或反驳,如果不兼容)。

注意:我不关心动态类型或其他类型,我只关心接口函数本身。

注意:假设所使用的编译器版本是ABI稳定的整体--没有重大的版本更改。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-13 08:40:48

是的,只要InterfaceA中虚拟函数的名称、参数和顺序不改变,它就会保持二进制兼容。请注意,这允许您在类声明的末尾添加函数。

( C++规范可能没有明确保证这一点,但COM依赖于此,因此大型C++编译器将以这种方式工作。)

票数 3
EN

Stack Overflow用户

发布于 2014-12-17 23:30:25

假设您没有跨越ABI边界使用DerivedB,那么您应该能够做任何您想做的事情。纯虚拟类(DerivedA)是最重要的,如果您不改变它,那么您是正确的-任何使用指向InterfaceA的指针都不会有任何跨越边界的问题。

事实上,您甚至可以将一个函数添加到InterfaceA的末尾,只要它是一个叶接口(即没有其他接口继承),而且该函数不是另一个函数的过载。当然,它需要遵循与其他函数相同的"ABI规则“--即参数类型必须是原始类型或指向其他接口的指针,等等。如果您有一个版本控制系统,您的应用程序可以检查插件的版本,并确定是否可以安全地调用新函数--从而为更新插件添加功能,但在更改之前编译的旧插件仍能工作。挺酷的!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7398902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档