c++ - 如果我只使用指向基类的指针,更改私有(private)派生类是否会影响 ABI?

标签 c++ c++11

我最近一直在阅读 C++ 中的 PIMPL 习语及其相对于抽象基类的优势。 PIMPL 的要点之一是,如果实现发生变化,它会保留 ABI。我在互联网上看过很多文章,甚至在 StackOverflow 上看过类似的问题。但是,我无法找到以下问题的答案:

假设我有一个基类 A和一个实现(派生类)B .现在,外部代码收到 B对象,但仅通过指向基类的指针 A (他们只能使用 A 中可用的任何方法或数据成员)。现在,如果我更改 B 的实现,例如添加新的私有(private)成员,这会导致 ABI 损坏吗?我的逻辑告诉我这不应该是这种情况,因为外部代码对 B 一无所知。因此其中的更改根本不会影响外部代码。

有人可以告诉我我是否错了并解释原因吗?提前谢谢你。

编辑:澄清我的问题:我有一个包含类 A 的程序和 B (第二个派生自 A ,覆盖虚拟方法并添加新数据成员,所有这些成员都不属于“API”类 A ),它动态加载外部 .so 文件(通过 dlopen()/dlsym() )。问题是当 B 时是否需要重新编译这些库?更改(共享库中的代码仅使用 A )

最佳答案

你是对的——毕竟,有问题的代码是在任何 B 定义可见的情况下编译的,所以它怎么可能是错误的呢?即使 B 继承自多个基类(甚至多个具有虚函数的类),vtable(s) 也包含任何指针调整所需的信息。

关于c++ - 如果我只使用指向基类的指针,更改私有(private)派生类是否会影响 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50541373/

相关文章:

c++ - 是否有一种内存有效的方法来探索从输入排列生成的解决方案?

c++ - 创建一个空的 shared_ptr 最简单的方法是什么?

c++ - c++0x 的正式名称是什么?

c++ - 在 C++ 中,是否可以获取函数的返回类型以便在不调用该函数的情况下声明一个变量?

c++ - Unix 域 : connect() : No such file or directory

c++ - 0's coming out as -85993460 instead of 0' 的数组

c++ - 为什么我不能使用 lambda 按值对 std::map 进行排序

c++ - 在 C++11 中绘制 n 个随机值的优雅方法?

c++ - 在 C++ 中使用 popen 调用时 cli 实用程序崩溃。在 shell 或 fork、exec 等中工作正常

c++ - 多参数隐式转换、运算符重载