下面程序的结果是多少?怎么分析的 谢谢!!!!

luoyuxuan566 2012-09-30 10:25:56

class Base{
public:
int m_a;
Base(int a = 2):m_a(a){printf("A %d",m_a);}
virtual ~Base() {printf("B %d",m_a);}
};
class Derived : public Base {
public:
Derived (int a = 4):Base(a){printf("C %d",m_a);}
~Dwrived (){printf("D %d",m_a);}
};
int main()
{
Base *aa,bb;
aa =new Derived;
delete aa;
return 0;
}



...全文
138 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyuxuan566 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
对不起,还漏了一个,最后在退出main()函数时(退回到startup code),此时局部对象bb超出作用域范围,所以发生析够,所以结果应该还增加一项: B 2.即最终结果为:
A 2A 4C 4D 4B 4B 2
[/Quote]

非常感谢!!
有些明白了~~~
漫步者、 2012-09-30
  • 打赏
  • 举报
回复

class Base{
public:
int m_a;
Base(int a = 2):m_a(a){printf("A %d",m_a);}
virtual ~Base() {printf("B %d",m_a);}
};
class Derived : public Base {
public:
Derived (int a = 4):Base(a){printf("C %d",m_a);}
~Derived (){printf("D %d",m_a);}
};
int main()
{
Base *aa,bb;
aa =new Derived;
delete aa;
return 0;
}
//记住:构造是先从父类开始构造,再到子类,析构以相反的方向析构!
JiMoKuangXiangQu 2012-09-30
  • 打赏
  • 举报
回复
对不起,还漏了一个,最后在退出main()函数时(退回到startup code),此时局部对象bb超出作用域范围,所以发生析够,所以结果应该还增加一项: B 2.即最终结果为:
A 2A 4C 4D 4B 4B 2
JiMoKuangXiangQu 2012-09-30
  • 打赏
  • 举报
回复
首先代码有点问题:
要添加语句:
#include <cstdio>

Dwrived --> Derived

输出结果是:
A 2A 4C 4D 4B 4

语句
Base *aa, bb;

语句创建局部对象bb,调用构造函数Base::Base(),输出A 2;
语句
aa = new Derived;

创建派生类对象,先调用父类构造函数:Base::Base(),输出A 4;
然后调用派生类构造函数Derived::Derived(),输出C 4;
语句
delete aa;

先调用派生类析构函数Derived::~Derived(),输出D 4;
然后调用父类析构函数Base::~Base(),输出B 4.

64,662

社区成员

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

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