写出下面代码的输出结果,并进行代码输出分析
#include
using namespace std;
class BaseA
{
public:
BaseA(int a, int b);
~BaseA();
protected:
int m_a;
int m_b;
};
BaseA::BaseA(int a, int b) :m_a(a), m_b(b) {
cout << "BaseA constructor" << endl;
}
BaseA::~BaseA() {
cout << "BaseA destructor" << endl;
}
class BaseB {
public:
BaseB(int c, int d);
~BaseB();
protected:
int m_c;
int m_d;
};
BaseB::BaseB(int c, int d) :m_c(c), m_d(d) {
cout << "BaseB constructor" << endl;
};
BaseB::~BaseB() {
cout << "BaseB destructor" << endl;
}
class Derived :public BaseA, public BaseB {
public:
Derived(int a, int b, int c, int d, int e);
~Derived();
public:
void show();
private:
int m_e;
};
Derived::Derived(int a, int b, int c, int d, int e) :BaseA(a, b), BaseB(c, d), m_e(e) {
cout << "Derived constructor" << endl;
}
Derived::~Derived() {
cout << "Derived destructor" << endl;
}
void Derived::show() {
cout << m_a << "," << m_b << "," << m_c << "," << m_d << "," << m_e << endl;
}
int main() {
Derived obj(1, 2, 3, 4, 5);
obj.show();
return 0;
}
BaseA constructor
BaseB constructor
Derived constructor
1,2,3,4,5
Derived destructor
BaseB destructor
BaseA destructor
代码输出分析如下:
首先创建了一个 Derived 类型的对象 obj,在创建过程中调用了 Derived 的构造函数。
在 Derived 构造函数中,首先调用 BaseA 的构造函数,输出 "BaseA constructor",然后调用 BaseB 的构造函数,输出 "BaseB constructor",最后初始化 Derived 的成员变量 m_e。
在 Derived 构造函数执行完成后,调用 obj 的 show() 函数,输出 m_a、m_b、m_c、m_d 和 m_e 的值。
main 函数执行完成后,销毁了 obj 对象,调用了 Derived 的析构函数,输出 "Derived destructor";接着调用 BaseB 的析构函数,输出 "BaseB destructor";最后调用 BaseA 的析构函数,输出 "BaseA destructor"。
BaseA constructor
BaseB constructor
Derived constructor
1,2,3,4,5
Derived destructor
BaseB destructor
BaseA destructor
我觉得没什么好分析的,无非就是构造函数的调用顺序,简单来说一句话,构造从基类开始,析构从派生类开始
不知道你这个问题是否已经解决, 如果还没有解决的话: