首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++基础有关问题求教

2012-07-31 
C++基础问题求教C/C++ code#include iostreamusing namespace stdclass Base {public:Base(int i) { co

C++基础问题求教

C/C++ code
#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,请给出具体流程。谢谢

[解决办法]
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。

热点排行