コンパイラの警告 (レベル 2) C4275

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