C++基础问题求教

陈思有 2012-06-27 06:09:01
#include <iostream>
using namespace std;
class Base
{
public:
Base(int i) { cout << "Base" << i << endl; }
~Base () { }
};
class Base1: virtual public Base
{
public:
Base1(int i, int j=0) : Base(j) { cout << "Base1" << i << endl; }
~Base1() {}
};
class Base2: virtual public Base
{
public:
Base2(int i, int j=0) : Base(j) { cout << "Base2" << i << endl; }
~Base2() {}
};
class Derived : public Base2, public Base1
{
public:
Derived(int a, int b, int c, int d) : mem1(a), mem2(b), Base1(c),
Base2(d), Base(a)
{ cout << b; }
private:
Base2 mem2;
Base1 mem1;
};
void main() { Derived objD (1, 2, 3, 4); }


输出为什么是14302012,请给出具体流程。谢谢
...全文
195 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈思有 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
Base1
Base24
Base13
Base0
Base22
Base0
Base11
2

以上为输出结果,代码只定义了一个对象Derived objD,步骤如下:
1、执行构造函数,子类的构造函数执行之前,会先调用基类的构造函数,可以得到最开始调用的为Base构造函数,输出为“Base1”,而后调用Base2和Base1构造函数,先后顺序应该和代码中“class Der……
[/Quote]


非常感谢!
陈思有 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
没有问题啊,能通过啊,你用的什么编译器
[/Quote]

大哥,我问的是为什么结果是那样?请给出详细流程
周成风 2012-06-27
  • 打赏
  • 举报
回复
Base1
Base24
Base13
Base0
Base22
Base0
Base11
2

以上为输出结果,代码只定义了一个对象Derived objD,步骤如下:
1、执行构造函数,子类的构造函数执行之前,会先调用基类的构造函数,可以得到最开始调用的为Base构造函数,输出为“Base1”,而后调用Base2和Base1构造函数,先后顺序应该和代码中“class Derived : public Base2, public Base1 ”谁先前面相关。输出为“Base24”和“Base13”。我
2、调用完基类构造函数,开始初始化成员变量mem2和mem1,初始化顺序和定义顺序相关。每个变量初始化之前,先调用基类构造函数,得到输出结果:
Base0
Base22
Base0
Base11

3、最后进入了类的构造函数,执行代码{ cout << b; },输出2。

编译器VS2010,Win7环境。对了,基类的析构函数一般为virtual。
笨蛋糕 2012-06-27
  • 打赏
  • 举报
回复
没有问题啊,能通过啊,你用的什么编译器
陈思有 2012-06-27
  • 打赏
  • 举报
回复
没人理我?

64,654

社区成员

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

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