一个对vptr和析构函数的试验(请高手分析其原理)
huche 2004-06-15 10:24:43 class CStr
{
public:
cstr(){cout << "cstr function" << endl;}
virtual ~cstr(){cout << "~cstr function" << endl;}
virtual test(){cout << "test function" << endl;}
private:
char *str;
};
typedef struct
{
CStr str;
int jjj;
}tagTest;
int main(int argc, char* argv[])
{
tagTest *tag = new tagTest;
memset(tag, 0x00, sizeof(tagTest)); // tag->str->vptr被初始化为0x00
tag->str.test(); // 由于CStr::test()是虚函数,而vptr已被初始化为0x00,
// 所以访问内存错误
delete tag; // 但是,如果上一行注释掉,同样是虚函数的析构函数能够被调用
return 0;
}
我的问题是如果析构函数不是通过vptr访问的话,为什么基类指向派生类的指针被delete的时候,能够先调用派生类的析构函数,再调用基类的析构函数呢?
请高手分析vptr和析构函数之间的关系!谢谢