Microsoft 固有の仕様Microsoft Specific

これは、 _ _declspec拡張属性。This is a __declspec extended attribute.

この形式の _ _declspec任意のクラス宣言に適用できますが、自分でインスタンス化されないクラスを示す、純粋なインターフェイス クラスにのみ適用する必要があります。This form of __declspec can be applied to any class declaration, but should only be applied to pure interface classes, that is, classes that will never be instantiated on their own. _ _Declspecのコンス トラクターおよびクラスのデストラクターの vfptr を初期化するコードの生成を停止します。The __declspec stops the compiler from generating code to initialize the vfptr in the constructor(s) and destructor of the class. 多くの場合、これは、クラスに関連付けられている vtable への参照のみを削除するので、リンカーはこれを削除します。In many cases, this removes the only references to the vtable that are associated with the class and, thus, the linker will remove it. このような形態を使用して _ _declspecコードのサイズが大幅に短縮されることができます。Using this form of __declspec can result in a significant reduction in code size.

マークされたクラスをインスタンス化しようとした場合novtableおよびクラス メンバーにアクセスし、アクセス違反 (AV) が表示されます。If you attempt to instantiate a class marked with novtable and then access a class member, you will receive an access violation (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();
In Y

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also