首页 > 试题广场 >

下面伪代码程序: Class Base

[单选题]
请分析以下 C++ 代码,并选出程序运行后的正确输出。
#include <iostream>

class Base {
public:
    Base(int i) { 
        std::cout << i; 
    }
};

class Base1 : virtual public Base {
public:
    Base1(int i, int j = 0) : Base(j) { 
        std::cout << i; 
    }
};

class Base2 : virtual public Base {
public:
    Base2(int i, int j = 0) : Base(j) { 
        std::cout << i; 
    }
};

class MM : public Base2, public Base1 {
public:
    MM(int a, int b, int c, int d) 
      : Base(a), Base2(d), Base1(c), mem2(b), mem1(a) {
        std::cout << b;
    }

private:
    Base2 mem2;
    Base1 mem1;
};

int main() {
    MM objD(1, 2, 3, 4);
    return 0;
}
当创建对象 `MM objD(1, 2, 3, 4)` 时,程序的输出是什么?

  • 134122
  • 123412
  • 14302012
  • 143212
关键知识点:虚基类在一个对象的生命周期内只会构造一次

MM类被构造后,会依次执行:
1.虚基类(一个对象生命周期只构造一次):
    Base  (1)    ===》输出 1

2.直接基类(按照继承列表顺序):因为“class MM : public Base2, public Base1",所以先Base2。
    Base2 (4)    ===》输出 4(当前对象生命周期内,虚基类Base已构造过,因此不调用Base
    Base1 (3)    ===》输出 3  (同上:不调用Base的构造)

3.成员子对象(按照类中声明顺序):因为mem2(b)先被声明,所以先mem2 (2)  
    mem2 (2)    ===》输出 0  2 (因为mem2是新创建的Base2类对象,会调用虚基类Base的的构造
    mem1 (1)    ===》输出 0  1 (同上:先调用虚基类Base的构造,再调用Base1的构造)

4.最后进入MM 构造函数
    std::cout<<2<<std::endl ===> 输出  2

个人见解,如有误望各位大佬多指教。
发表于 今天 12:22:41 回复(0)