novtable

Блок, относящийся только к системам Майкрософт

Это расширенный __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

Завершение блока, относящегося только к системам Майкрософт

См. также

__declspec
Ключевые слова