基类指针指向派生类对象,基类不带虚函数,子类带虚函数产生的异常分析
基类指针指向派生类对象,指针的起始地址一定是指向基类起始地址的
这种情况下,当基类没有虚函数,而子类存在虚函数时,就会出现问题,因为
子类对象的起始地址存放的是vfptr
#include<iostream>
using namespace std;
class base
{
public:
int ma;
};
class b :public base
{
public:
virtual void test() {}
};
int main()
{
base* p = new b();
cout << &(p->ma) << endl;
cout << p << endl;
cout << p - 1 << endl;
//delete p;//这时p实际上并不是指向开辟内存的起始地址,
/*
1 > class b size(8) :
1 > +-- -
1 > 0 | {vfptr} 正确的应该指向这里
1 > 4 | +-- - (base class base) 实际上p指向这里,
1 > 4 | | ma
1 > | +-- -
1 > +-- -
1 > b::$vftable@:
1 > | &b_meta
1 > | 0
1 > 0 | &b::test
*/
char* m = (char*)p;
m -= 4;
cout <<"m="<<(void*)m << endl;
p = (base*)m;
delete p;
//delete (p-1);//p-1 相当于往上面走了四个字节
return 0;
}