覆盖的一个题

#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);

总结: 基类指针指向派生类对象,永远指向的都是派生类从基类继承的那部分数据的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值