#include<iostream> using namespace std; class B1 { public: B1(int i){cout<<"constructing B1"<<i<<endl;} ~B1(){cout<<"destructing B1"<<endl;}; }; class B2 { public: B2(int j){cout<<"constructing B2"<<j<<endl;} ~B2(){cout<<"destructing B2"<<endl;} }; class B3 { public: B3(){cout<<"constructing B3"<<endl;} ~B3(){cout<<"destructing B3"<<endl;} };class C:public B2,public B1,public B3//基类构造函数按其继承顺序执行 { private: B1 mB1; B2 mB2; B3 mB3; public: C(int a,int b,int c,int d):B1(a),mB2(d),mB1(c),B2(b){ } }; void main() { C obj(1,2,3,4); }解释一下这段代码的原理
时间: 2024-03-31 07:31:55 浏览: 54
这段代码定义了三个类B1、B2和B3,以及一个派生类C,C继承了B1、B2和B3这三个基类。在C类的构造函数中,对于基类的构造函数调用,按照它们在继承列表中的顺序进行调用。在C类的构造函数中,同时也调用了B1、B2和B3类的构造函数,而对象成员mB1、mB2和mB3则会在C类的构造函数中被初始化。在main函数中,创建了一个C类的对象obj,它的构造函数接收了四个int型参数,这些参数会传递给B1、B2和mB2对象的构造函数进行初始化。当程序运行结束时,析构函数会按照与构造函数相反的顺序被调用,并释放内存。
相关问题
#include <iostream> using namespace std; class A { int a; public: A(){ cout<<"Constructing A"<<endl; } }; class B { public: B(){ cout<<"Constructing B"<<endl;} }; class B1:virtual public B, virtual public A{ public: B1(int i){ cout<<"Constructing B1"<<endl; } }; class B2:public A, virtual public B { public: B2(int j){ cout<<"Constructing B2"<<endl; } }; class D: public B2, public B1 { public: D(int m,int n): B1(m),B2(n){ cout<<"Constructing D"<<endl; } A a; }; int main(){ D d(1,2); }怎么输出
输出结果为:
Constructing B
Constructing A
Constructing B1
Constructing A
Constructing B2
Constructing D
Constructing A
解释:
1. 首先,创建了一个名为D的类,它继承了B2和B1两个类。
2. 在创建D对象时,D的构造函数被调用,并且必须调用其直接基类的构造函数来初始化它们。
3. 在调用B1和B2的构造函数时,它们的虚基类A的构造函数也被调用了,因为A是B1和B2的虚基类。
4. 最后,在D的构造函数中,还创建了一个名为a的A类对象,输出了最后一条语句。
因此,输出的顺序为:B->A->B1->A->B2->D->A。
编写主函数测试以下程序派生类构造函数执行的顺序,并分析其原因。 #include<iostream> using namespace std; class B1 { public: B1(int i) {cout << "constructing B1" << i << endl; } ~B1(){ cout << "destructing B1" << endl; } }; class B2 { public: B2(int i) { cout << "constructing B2" << i << endl; } ~B2() { cout << "destructing B2" << endl; } }; class B3 { public: B3() { cout << "constructing B3 *"<< endl; } ~B3() { cout << "destructing B3" << endl; } }; class C :public B2, public B1, public B3 { public: C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b){} private: B1 memberB1; B2 memberB2; B3 memberB3; }; int main() { }
在主函数中创建一个 C 类的对象,并传递参数。创建对象时,构造函数的执行顺序为:先执行基类 B1 的构造函数,再执行基类 B2 的构造函数,最后执行成员变量 memberB1、memberB2、memberB3 的构造函数。析构函数的执行顺序与构造函数相反,先执行成员变量的析构函数,再执行基类的析构函数。
因此,程序输出的结果应该为:
```
constructing B1 10
constructing B2 20
constructing B1 30
constructing B3 *
destructing B3
destructing B1
destructing B2
destructing B1
```
其中,创建 C 类对象时传递的参数分别为:10、20、30、40。其中,构造函数的参数 a 为 10,会调用 B1 的构造函数;参数 b 为 20,会调用 B2 的构造函数;参数 c 为 30,会调用 memberB1 的构造函数;参数 d 为 40,会调用 memberB2 的构造函数。因此,输出结果中先出现了 "constructing B1 10",再出现了 "constructing B2 20"。接着,memberB1 和 memberB2 的构造函数被调用,因此输出 "constructing B1 30" 和 "constructing B3 \*"。最后,在程序结束时,析构函数按照相反的顺序被调用,先调用 memberB3 的析构函数,再调用基类 B1 和 B2 的析构函数,最后调用 memberB1 的析构函数。
阅读全文