ATL中的ATL_NO_VTABLE宏
ATL_NO_VTABLE可以让编译器不产生VTable,并且不设置VPointer的值。
正常情况下,在调用构造函数和析构函数的时候,编译器都会插入相应的代码。如果ATL_NO_VTABLE,可以省去这些代码。ATL中使用这个,是因为这个类为抽象类,不需要VTable。真正的类是CComObject<XXX>,它继承用户的类。
--------------------------------------------------------------
#define ATL_NO_VTABLE __declspec(novtable) class ATL_NO_VTABLE MyBase { public: MyBase() { cout << "MyBase::MyBase()" << endl; } virtual ~MyBase() { cout << "MyBase::~MyBase()" << endl; } }; class Derive :public MyBase { public: Derive() { cout << "Derive::Derive()" << endl; } virtual ~Derive() { cout << "Derive::~Derive()" << endl; } }; int main(int argc, char* argv[]) { MyBase* p1 = new Derive; delete p1; cout << "==========================" << endl; MyBase* p2 = new MyBase(); delete p2;//运行时出错 return 0; }
--------------------------------------------------------------