代码如下图,请问以下代码实际运行结果是什么()
#include <iostream>
class Base {
public:
Base(const char* p_szName) :m_szName(p_szName) { std::cout << m_szName << ","; }
virtual ~Base() { std::cout << "~" << m_szName << ","; }
private:
const char* m_szName;
};
class Derived :public Base {
public:
Derived(const char* p_szName) :m_szName(p_szName),
m_objA((const char*)"A"),
m_objB((const char*)"B"),
m_objE((const char*)"E"),
m_objF((const char*)"F"),
m_objG((const char*)"G"),
Base((const char*)"C")
{
std::cout << m_szName << ",";
}
virtual ~Derived() {
std::cout << "~" << m_szName << ",";
}
private:
const char* m_szName;
Base m_objE;
Base m_objG;
Base m_objF;
Base m_objB;
Base m_objA;
};
int main()
{
Base* p = new Derived("D");
delete p;
return 0;
}
代码的主函数中创建了一个指向Derived类的Base类指针,传入参数‘D’;
首先调用Derived的有参构造函数,在初始化列表中,分别初始化了参数m_szName;
对象m_objA,m_objB,m_objE,m_objF,m_objG;Base类对象;
初始化列表中的顺序为m_objAj>>m_objBj>>m_objEj>>m_objFj>>m_objGj>>Base对象;
Derived类中的声明顺序为m_obj>>m_objBj>>m_objEj>>m_objFj>>m_objGj;
但是调用规则
(1)按照基类到对象到派生类进行调用;
(2)初始化列表中对象调用顺序需要按照类中声明顺序
因此:
首先调用Base类的构造函数,打印输出‘C’;
之后调用初始化对象的构造函数按照声明顺序,依次打印‘E’,‘G’,‘F’,‘B’,‘A’;
析构的调用与构造的调用正好相反。
打印输出为:
C,E,G,F,B,A,D,~D,~A,~B,~F,~G,~E,~C。