gpt4 book ai didi

c++ - 添加新继承的 "interface"和虚拟方法需要重新编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:43 26 4
gpt4 key购买 nike

现有的答案涵盖了一般情况,但它们有些模糊,我需要确定这一点。

考虑:

  • 派生自抽象基类“接口(interface)”的现有定义类。
  • 类是库的一部分,被编译成多个 dll,这些 dll 通过接口(interface)相互通信。

然后添加:

  • 第二个“接口(interface)”,定义的类现在将从中派生(因此现在它有两个接口(interface))。
  • 由新接口(interface)访问的已定义类的新虚拟方法。

我是否需要重新编译链接该库的每个 dll,还是只需要重新编译使用新方法的 dll?

编辑:

我的原始接口(interface)公开了一个动态方法,它是 Dynamic(int OP, void* args) 是否可以添加一个转换为新接口(interface)的操作?

COM 如何设法在不破坏现有接口(interface)的情况下向对象添加新接口(interface)?是否堆叠接口(interface),使用多重继承等???

让我来阐述一下它的工作方式。

静态链接库接口(interface)

In statically linked library

class Interface1
{
virtual Method1() = 0;
virtual Method2() = 0;
}
class NotReallyInterface2 : Interface1
{
virtual Method1() = 0;
virtual Method2() { // does something }
}

在 dll 中

In A.dll

Load statically linked library
class A : NotReallyInterface2
{
virtual Method1() { // does something }
}

In B.dll

Load statically linked library
class B: NotReallyInterface2
{
virtual Method1() { // does something different }
}

我要补充

class Interface3
{
virtual Method3() = 0;
}

我这里有一些问题,因为我的继承结构看起来像。

[a.dll [ library : Interface1 < NotReallyInterface2 ] < A ]
[b.dll [ library : Interface1 < NotReallyInterface2 ] < B ]

所以我很害怕

[ a.dll [ library : Interface1 < NotReallyInterface2 ] < Interface3 < A ]

不会工作。

编辑2

所以我发现了我的问题。显然,其他 dll 和可执行文件正在引用我的 NotReallyInterface2。这意味着多个 dll 和 exe 正在构建相同的基类。因此,如果基类的那些“拷贝”不同步,就会失败。这意味着我无法更改 NotReallyInterface2 中的单个方法签名。

如果没有人引用 NotReallyInterface2,这会奏效,现在我从答案中得到了这一点,整个事情变得有意义了。

最佳答案

您需要重新编译那些直接引用派生类的 DLL。那些只通过接口(interface)引用它的将继续工作。

COM 正是依赖于此。 COM ABI 规范有效地要求每个兼容的 C++ 编译器不要以导致接口(interface)停止工作的方式搞砸 vtable。这就是为什么 COM 的基本要求之一是永远不要通过添加/删除/更改函数或为其提供新的基本接口(interface)来修改已发布的接口(interface)。

通过派生旧接口(interface)并使实现类派生自新接口(interface)来添加新接口(interface)不会破坏它;从实现类中的许多接口(interface)进行多重继承也是如此。

不那么抽象的类不应该成为阻碍,但现在您超出了 COM 的保证范围。如果那个类有数据成员,那就更糟了。我认为不重新编译代码仍然是安全的,但我不想再依赖它了。

关于c++ - 添加新继承的 "interface"和虚拟方法需要重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131122/

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