#include<iostream>
using namespace std;
class Base
{
private :
int ma;
public:
void show(){cout<<"ma="<<ma<<endl;}
};
class Derive: public Base
{
private :
int mb;
public:
void virtual show(){cout<<"mb="<<mb<<endl;}
};
int main()
{
Base*p = new (nothrow)Derive;
p->show();
return 0;
}
问这段代码能运行通过吗,为什么,该如何才能让它运行通过;
答:
首先,此代码运行不通过;
因为派生类里有虚函数,于是派生类的对象内存变为
vfptr
base::
ma
mb
多生成了一个vfptr(虚函数表指针),而派生类继承基类其指针p指向的是基类的开始,而基类的对象内存是
ma,并没有虚函数表指针;
故p指向ma,而不是实际的内存的起始地址,而是在起始地址的基础上+4 ;
当delete是发生错误;
应该改为
int q = (int )p;
delete (q-1);
总结: 基类指针指向派生类对象,永远指向的都是派生类从基类继承的那部分数据的地址。