novtable

Microsoft-spezifisch

Dies ist ein erweitertes __declspec-Attribut.

Diese Art von __declspec kann auf jede Klassendeklaration zugewiesen werden, sondern muss reinen Schnittstellenklassen d. h. nur Klassen angewendet werden, die nie auf ihren eigenen instanziiert werden.Beendet den vom Compiler __declspec Generieren von Code, um das vfptr in Konstruktoren und Destruktoren der Klasse zu initialisieren.In vielen Fällen entfernt das die einzigen Verweise auf die vtable, die der Klasse zugeordnet werden, sodass der Linker diese entfernt.Mithilfe dieses Formulars aus __declspec kann eine erhebliche Verringerung der Codegröße führen.

Wenn Sie versuchen, eine Klasse zu instanziieren, die mit novtable und dann einen Klassenmember zuzugreifen gekennzeichnet ist, erhalten Sie eine Zugriffsverletzung (AV).

Beispiel

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

Siehe auch

Referenz

__declspec

C++-Schlüsselwörter