【发布时间】:2011-04-21 15:13:02
【问题描述】:
我的库有两个类,一个基类和一个派生类。在当前版本的库中,基类有一个虚函数 foo(),派生类不会覆盖它。在下一个版本中,我希望派生类覆盖它。这会破坏 ABI 吗?我知道通常会引入一个新的虚函数,但这似乎是一个特例。我的直觉是它应该改变 vtbl 中的偏移量,而不实际改变表的大小。
显然,由于 C++ 标准没有强制要求特定的 ABI,所以这个问题在某种程度上是特定于平台的,但实际上,大多数编译器中破坏和维护 ABI 的方法是相似的。我对 GCC 的行为很感兴趣,但是人们可以回答的编译器越多,这个问题就越有用;)
【问题讨论】:
-
如果你在做 ABI 为什么不使用纯 C 作为接口?
-
因为它是一个 C++ 库,旨在以惯用的 C++ 方式使用。你认为 QT 应该只在 C 中提供他们的 API 吗? :P
标签: c++ backwards-compatibility subclassing virtual-functions abi