gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:55:44 25 4
gpt4 key购买 nike

我最近一直在阅读 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/

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