C ++:纯虚函数和二进制兼容性

时间:2019-06-13 03:04:13

标签: c++ dll virtual-functions abi vtable

我已经编写了Windows C ++ DLL(MSVS2017),可以由第三方应用程序加载。

我的DLL包含一个函数,该函数可以返回指向包含我实现的纯虚函数的自定义类的接口的指针。定义此类的头文件已提供给第三方开发人员,因此他们可以将我的类的指针强制转换为接口类并调用函数。

所以我提供给其他开发人员的界面如下:

class MyInterface
{
   virtual int foo() = 0;
};

我的课看起来像这样:

class MyClass : public MyInterface
{
    int foo(){return 1;}
};

一旦第三方应用程序加载了我的DLL并收到指向MyClass对象的指针,他们就可以执行以下操作:

#include "MyInterface.h"
...
MyInterface* interface = (MyInterface*)pointerSentFromMyDLL;
int result = interface->foo();

但是,如果我想修改MyInterface.h头文件并添加一些新功能,该怎么办?在不破坏应用程序的情况下有可能吗?还是他们还需要使用更新的标头重新编译?

例如,如果我这样修改标头:

class MyInterface
{
   virtual float bar() = 0;
   virtual int foo() = 0;
};

然后在我的DLL中实现新功能并重新编译它,他们对旧标头的使用在他们的编译代码中是否仍然有效?还是需要使用修改后的标头重新编译?显然,他们将无法调用bar(),但是他们仍然可以不重新编译就调用foo()吗?

换句话说,如果将纯虚函数添加到接口类中还是仅添加我一个,我们都需要重新编译吗?

0 个答案:

没有答案