对象切割会带来什么?

zmzbs123 2008-04-09 09:47:58
请看下面的测试代码
#include <iostream>
#include <stdlib.h>

using namespace std;
class CA
{

public:
int m;
CA(int r=0){m=r;printf("%d CA::CA()\n",m);}
~CA(){printf("%d CA::~CA()\n",m);}
void f(){printf("%d CA::f()\n",m);}

};
class CB : public CA
{
public:
CA mcal;

CB():mcal(2){printf("CB::CB()\n");}
~CB(){printf("CB::~CB()\n");}
void f(){printf("%d CB::f()\n",m);}
};

int main(int argc, char *argv[])
{
CA *pl = new CB;
pl->f();
delete pl;

system("PAUSE");
return 0;
}
这样得出的结果是
0 CA::CA()
2 CA::CA()
CB::CB()
0 CA::f()
0 CA::~CA()
此处,pl在CB的object中发生了切割,我的问题是:
1:在CB的object中,内存布局是怎样的?
2:为什么非静态成员变量m的值是0?

...全文
127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmzbs123 2008-04-09
  • 打赏
  • 举报
回复
明白了,谢谢大家:}结贴~~
晨星 2008-04-09
  • 打赏
  • 举报
回复
从父类继承下来的成员默认情况下使用父类的默认构造函数初始化。
你的CA类的单参构造函数有默认值,于是也就成为了默认构造函数,把m初始化成了0。
晨星 2008-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zmzbs123 的回复:]
可是CB对象在构造的时候是继承mcal(2)的啊
[/Quote]
这是什么话?
构造函数后面的冒号是对象初始化列表,不是“继承”。
0黄瓜0 2008-04-09
  • 打赏
  • 举报
回复

pl指向的对象
-------
m 从CA集成来的部分,在直观上看不见.但楼主不要以为它不存在.
-------
mcal mcal(2)只初始化到这里面的m.与上面的m无关.
-------
ttkk_2007 2008-04-09
  • 打赏
  • 举报
回复
可是CB对象在构造的时候是继承mcal(2)的啊
==============================
怎么继承了,只是含有一个CA的对象而已,因为你基类析构函数不是virtual的,所以不调用子类析构函数
taodm 2008-04-09
  • 打赏
  • 举报
回复
effective c++ 第二版item22
晨星 2008-04-09
  • 打赏
  • 举报
回复
你的程序中没有发生切割啊。
CA *pl = new CB;
这句是指针自动向上转型而已,不是一般的对象拷贝,因此没有切割,一切正常。
zmzbs123 2008-04-09
  • 打赏
  • 举报
回复
可是CB对象在构造的时候是继承mcal(2)的啊
wangya55 2008-04-09
  • 打赏
  • 举报
回复
在CB的object中,其中的成员函数可以访问ca中的成员

在CA的构造函数中你已经将m的植默认为0了,正如楼上所说的
ttkk_2007 2008-04-09
  • 打赏
  • 举报
回复
cb的object中只有CA mcal和继承而来的m的空间
CA(int r=0){m=r;printf("%d CA::CA()\n",m);} 你不是给m赋值为0了

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧