我有两个DLL a.dll和b.dll,每个都有一个类AClass和BClass 我想让AClass和BClass继承并实现相同的接口AbsBase,这是一个纯粹的抽象类 在每个类中,我为__declspec(dllimport)和__declspect(dllexport)设置了#defines。当我正在尝试编译时,我得到了这个:
警告C4275:非dll接口类'AClass'用作dll接口类'AbsBase'的基础
基本上要我将AbsBase声明为__declspec(dllexport)
但是如果编译器按照他的方式使用它,我将不得不声明从a.dll和b.dll导出AbsBase。
为什么需要导出类的接口?
它有什么办法吗?
我应该从两个DLL中真正导出AbsBase吗?这有什么本质上的错误吗? (我需要定义一个新的XXX_EXPORT宏..)
答案 0 :(得分:3)
它看起来像是一个编译器警告而不是错误,所以它仍然可以工作。编译器只是让你知道你正在做的事情让你容易搞砸。只要两个DLL和核心程序都同意基类的定义,这样做是完全可以接受的。
您应该能够使用编译指示来抑制警告:
答案 1 :(得分:1)
这是值得担心的事情。编译器检测到基类中的代码可能会运行。它不是纯粹的虚方法,它知道如何过滤那些。也许是构造函数或析构函数?失败模式是类对象的内存布局在客户端代码与DLL中可能不同。这导致的运行时混乱非常难以诊断。
如果只要你可以保证客户端和DLL都使用完全相同的编译和链接设置进行编译,使用完全相同的CRT版本和那些工具,你就没问题了。您可以使用非标准__interface关键字而不是类来使基类保证抽象。
答案 2 :(得分:0)
我有一个提示:
class Base {
public:
virtual void f() = 0;
virtual void g() = 0;
virtual ~Base();
};
class A: public Base {
public:
virtual void f();
virtual void g();
};
class B: public Base {
public:
virtual void g(); // REVERSE ORDER
virtual void f();
};
虚方法表中f和g的顺序在基类中指定,非常需要此信息。