【发布时间】:2017-04-13 16:35:11
【问题描述】:
想法如下。我有一个库版本 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); som,它会起作用,还是应用程序会崩溃?在这两种情况下,类都没有成员,因此大小相同。
【问题讨论】:
-
由于继承的类不知道改变的接口,它的虚拟表中不会有关于它的信息。这将导致未定义的行为。简而言之:如果接口发生变化,需要重新编译依赖于这些接口的应用程序。
标签: c++ shared-libraries virtual-functions