ATL 2.1 была оптимизирована для компилятора Visual C++ 5.0. В частности, следует иметь в виду, что многие классы ATL объявляются с ATL_NO_VTABLE макрос:
класс ATL_&NO_VTABLE CComControl
{
nbsp; ...
}
ATL определяет ATL_NO_VTABLE следующим:
# ifdef _ATL_DISABLE_&NO_VTABLE
nbsp; # define ATL_NO_VTABLE
# else
# define ATL_NO_VTABLE __declspec(novtable)
# endif
Если _ATL_DISABLE_NO_VTABLE не указан, ATL_NO_VTABLE макрос расширяется до declspec(novtable) . Когда declspec(novtable) используется в объявлении класса предотвращает указателя vtable в конструкторе и деструкторе класса. Компоновщик может таким образом устранить vtable и все функции, указывает vtable, условии класса (обычно CComObject, CComAggObjectили CComPolyObject), не использует declspec(novtable) и таким образом будет правильно инициализировать указатель vtable.
По умолчанию мастер объектов ATL будет создавать новые классы с ATL_NO_VTABLE макрос. Как описано ранее, declspec(novtable) атрибут должен использоваться только с базовыми классами, которые нельзя напрямую. Кроме того, это небезопасно, вызывать виртуальные функции из конструктора любого объекта, который использует declspec(novtable) . Вам следует переместить любые такие вызовы метода FinalConstruct.
Если вы не уверены, следует ли вам использовать declspec(novtable) атрибут, можно удалить ATL_NO_VTABLE макрос из любого определения класса или вы глобально отключить его, указав #define _ATL_DISABLE_NO_VTABLE в файле stdafx.h, прежде чем все другие ATL заголовочные файлы включены.