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();
}