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; # визначити ATL_NO_VTABLE
# інше
# визначити ATL_NO_VTABLE __declspec(novtable)
#endif
Якщо _ATL_DISABLE_NO_VTABLE не визначено, у ATL_NO_VTABLE макрос розширюється до declspec(novtable) . Коли declspec(novtable) використовується в класі декларації, він запобігає таблиці вказівник будучи ініціалізовано в класу в конструктор і деструктор. Компонувальник таким чином можна усунути Віртуальна таблиця і всі функції вказав на таблиці, умови, що більшість отриманих класу (зазвичай CComObject, CComAggObjectабо CComPolyObject) не підтримує declspec(novtable) і буде таким чином ініціалізувати вказівник таблиці правильно.
За промовчанням, майстер ATL об'єкт буде генерувати нові класи з у ATL_NO_VTABLE макрос. Як зазначалося вище, в declspec(novtable) атрибут використовується з базових класів, які не є безпосередньо creatable. Крім того, це небезпечне називати віртуальних функцій від конструктора будь-який об'єкт, що використовує declspec(novtable) . Вам слід рухатися такі дзвінки до методу FinalConstruct.
Якщо ви не впевнені, чи слід використовувати в declspec(novtable) атрибут, можна видалити в ATL_NO_VTABLE макрос з будь-якого класу визначення або ви глобально відключити його за допомогою визначення #define _ATL_DISABLE_NO_VTABLE в stdafx.h, перш ніж всі інші ATL заголовні файли додаються.