覆盖的一个题
【摘要】 #include<iostream>
using namespace std;
class Base
{
private : int ma;
public: void show(){cout<<"ma="<<ma<<endl;}
};
class Derive: public Base
{
private : int...
#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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
问这段代码能运行通过吗,为什么,该如何才能让它运行通过;
答:
首先,此代码运行不通过;
因为派生类里有虚函数,于是派生类的对象内存变为
vfptr
base::
ma
mb
多生成了一个vfptr(虚函数表指针),而派生类继承基类其指针p指向的是基类的开始,而基类的对象内存是
ma,并没有虚函数表指针;
故p指向ma,而不是实际的内存的起始地址,而是在起始地址的基础上+4 ;
当delete是发生错误;
应该改为
int q = (int )p;
delete (q-1);
总结: 基类指针指向派生类对象,永远指向的都是派生类从基类继承的那部分数据的地址。
文章来源: blog.csdn.net,作者:IM-STONE,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/doubleintfloat/article/details/52529250
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)