novtable

Microsoft 固有の仕様

これは __declspec 拡張属性です。

この形式の __declspec は任意のクラス宣言に適用できますが、純粋なインターフェイス クラス (それ自体はインスタンス化されないクラス) だけに適用してください。 __declspec は、クラスのコンストラクターおよびデストラクター内の vfptr を初期化するコードをコンパイラが生成することを阻止します。 多くの場合、これは、クラスに関連付けられている vtable への参照のみを削除するので、リンカーはこれを削除します。 この形式の __declspec を使用すると、コード サイズが大幅に削減されます。

novtable でマークされたクラスをインスタンス化してから、クラス メンバーにアクセスしようとすると、アクセス違反 (AV) となります。

// novtable.cpp
#include <stdio.h>

struct __declspec(novtable) X {
   virtual void mf();
};

struct Y : public X {
   void mf() {
      printf_s("In Y\n");
   }
};

int main() {
   // X *pX = new X();
   // pX->mf();   // Causes a runtime access violation.

   Y *pY = new Y();
   pY->mf();
}
In Y

Microsoft 固有の仕様はここまで

関連項目

__declspec
キーワード