ATL 2.1 Visual c + + 5.0 컴파일러에 대 한 최적화 되었습니다. 특히, 알아야 할 많은 ATL 클래스 사용 하 여 선언 된 ATL_NO_VTABLE 매크로:
aTL_NO_VTABLE CComControl 클래스
{
nbsp; ...
}(&N)
ATL 정의 ATL_NO_VTABLE 같습니다.:
# ifdef _ATL_DISABLE_NO_VTABLE
nbsp; # define ATL_NO_VTABLE
# else
? # define ATL_NO_VTABLE __declspec(novtable)
# endif(&N)
만약 _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 헤더 파일은 포함。