基类指针指向派生类对象,基类不带虚函数,子类带虚函数产生的异常分析
基类指针指向派生类对象,指针的起始地址一定是指向基类起始地址的
这种情况下,当基类没有虚函数,而子类存在虚函数时,就会出现问题,因为
子类对象的起始地址存放的是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 | | ma1 > | +-- -1 > +-- -1 > b::$vftable@:1 > | &b_meta1 > | 01 > 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;
}