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 #กำหนด ATL_NO_VTABLE
#อื่น
#กำหนด ATL_NO_VTABLE __declspec(novtable)
#endif(&N)
ถ้า _ATL_DISABLE_NO_VTABLE ไม่มีกำหนด ATL_NO_VTABLE แมโครที่ขยายไปยัง declspec(novtable) เมื่อ declspec(novtable) ใช้ในการประกาศคลาส จะป้องกันตัวชี้ vtable ถูกเตรียมใช้งานในระดับชั้นกำหนดและ destructor ตัวเชื่อมโยงการจึงสามารถกำจัด vtable และฟังก์ชันทั้งหมดชี้ไปตาม vtable โดยไม่มีใช้คลามาส่วนใหญ่ (โดยปกติแล้วCComObject, CComAggObjectหรือCComPolyObject) declspec(novtable) และเตรียมจะดังนั้นจึงใช้ตัวชี้ vtable อย่างถูกต้อง?
โดยค่าเริ่มต้น ATL วัตถุตัวช่วยสร้างจะสร้างประเภทใหม่ด้วยการ ATL_NO_VTABLE แมโค อธิบายไว้ว่า ก่อนหน้านี้ declspec(novtable) เท่านั้นจะใช้แอตทริบิวต์กับชั้นฐานที่ creatable โดยตรงไม่ เพิ่มเติม จะไม่ปลอดภัยเมื่อต้องการเรียกใช้ฟังก์ชันต่าง ๆ เสมือนจากที่พารามิเตอร์ของวัตถุใด ๆ ที่ใช้ declspec(novtable) คุณควรย้ายใด ๆ เช่นเรียกเมธอดFinalConstruct?
ถ้าคุณไม่แน่ใจว่าคุณควรใช้การ declspec(novtable) แอตทริบิวต์ คุณสามารถเอาออกการ ATL_NO_VTABLE แมโครจากคำจำกัดความของคลาสใด ๆ หรือคุณทั่วโลกปิดได้ โดยการระบุ #define _ATL_DISABLE_NO_VTABLE ใน stdafx.h, ATL อื่น ๆ ทั้งหมดก่อนที่ ส่วนหัวของแฟ้มมา?