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

См. также

Ссылки

__declspec

Ключевые слова в C++