gpt4 book ai didi

C++ 继承和动态库

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:23 26 4
gpt4 key购买 nike

思路如下。我有一个库版本 1,其中的类如下所示:

class MY_EXPORT MyClass
{
public:
virtual void myMethod(int p1);
}

在版本 2 中,类被修改为:

class MY_EXPORT MyClass
{
public:
virtual void myMethod(int p1);
virtual void myMethod2(int p1, int p2);
}

//implementation of myMethod2 in cpp file
void MyClass::myMethod2(int p1, int p2)
{
myMethod(p1);
//...
}

现在假设用户再次编译库的版本 1,并通过覆盖 myMethod 扩展 MyClass。现在他将库更新到版本 2,无需重新编译。让我们进一步假设动态链接器仍然成功找到库并加载它。

问题是,如果我在库中的某处调用方法 instance->myMethod2(1, 2);,它会起作用,还是应用程序会崩溃?在这两种情况下,类都没有成员,因此大小相同。

最佳答案

我认为猜测该应用程序是否会崩溃没有意义,行为是未定义的。必须重新编译应用程序,因为库中有 ABI 更改。

当库调用 instance->myMethod2(1, 2); 时,它必须通过在应用程序代码中创建的虚拟表,假设只有一个虚拟方法:我的方法。从那时起,您将获得未定义的行为。简而言之,当库 ABI 更改时,您必须重新编译您的应用程序。

关于C++ 继承和动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43397483/

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