编译器警告(等级 2)C4275

non - DLL 接口类“class_1”用作 DLL 接口类“class_2”的基础

导出的类派生自未导出的类。

若要在导出具有 __declspec(dllexport) 的类时最大程度地减少数据损坏的可能性,请确保:

  • 通过从 DLL 导出的函数访问所有静态数据。

  • 类的任何内联方法都不能修改静态数据。

  • 类的任何内联方法都不会使用 CRT 函数或使用静态数据的其他库函数。

  • 任何内联类函数都不会使用 CRT 函数或用于访问静态数据的其他库函数。

  • 类的任何方法(无论是否内联)都不能使用 EXE 和 DLL 中的实例化具有静态数据差异的类型。

可以通过定义一个 DLL 来避免导出类,该 DLL 定义了一个具有虚函数的类,以及可以调用以实例化和删除该类型对象的函数。 然后,可以只调用该类型的虚函数。

如果从 C++ 标准库中的类型派生,编译调试版本 (/MTd),并且编译器错误消息引用 _Container_base,则可以在 Visual C++ 中忽略 C4275

// C4275.cpp
// compile with: /EHsc /MTd /W2 /c
#include <vector>
using namespace std;
class Node;
class __declspec(dllimport) VecWrapper : vector<Node *> {};   // C4275