思考:如何初始化父类成员?父类构造函数和子类构造函数有什么关系?子类对象的构造子类对象可以定义构造函数子类构造函数必须对继承而来的成员进行初始化直接通过初始化列表或者赋值的方式进行初始化调用父类构造函数进行初始化父类构造函数在子类中的调用方式默认调用适用于无参构造函数和使用默认参数的构造函数显示调用通过初始化列表进行调用使用于所有父类构造函数父类构造函数的调用class Child : public Parent{public: Child() // 隐式调用 { cout << “Child” << endl; } Child(string s) : Parent(Parameter to Parent) // 显示调用 { cout << “Parent” << s << endl; }}编程实验: 子类的构造初探#include <iostream>using namespace std;class Parent{public: Parent() { cout << “Parent()” << endl; } Parent(string s) { cout << “Parent(string s) : " << s << endl; }};class Child : public Parent{public: Child() // 隐式调用父类构造函数 { cout << “Child()” << endl; } Child(string s) : Parent(s) // 显示调用父类构造函数 { cout << “Child(string s) : " << s << endl; }};int main(){ Child c; Child cc(“cc”); return 0;}输出:Parent()Child()Parent(string s) : ccChild(string s) : cc子类对象中的构造构造规则子类对象在创建是会首先调用父类的构造函数先执行父类构造函数再执行子类的构造函数父类构造函数可以被隐式调用或者显示调用对象创建时构造函数的调用顺序调用父类的构造函数调用成员变量的构造函数调用类自身的构造函数口诀心法: 先父母,后客人,再自己编程实验: 子类构造深度解析#include <iostream>#include <string>using namespace std;class Object{public: Object(string s) { cout << “Object(string s) : " << s << endl; }};class Parent : public Object{public: Parent() : Object(“Default”) { cout << “Parent()” << endl; } Parent(string s) : Object(s) { cout << “Parent(string s) : " << s << endl; }};class Child : public Parent{private: Object mO1; Object mO2;public: Child() : mO1(“Default 1”), mO2(“Default 2”) { cout << “Child()” << endl; } Child(string s) : Parent(s), mO1(s + “1”), mO2(s + “2”) { cout << “Child(string s) : " << s << endl; }};int main(){ Child cc(“cc”); return 0;}输出:Object(string s) : ccParent(string s) : ccObject(string s) : cc1Object(string s) : cc2Child(string s) : cc子类对象的析构析构函数的调用顺序与构造函数相反执行自身的析构函数执行成员变量的析构函数执行父类的析构函数编程实验: 对象的析构#include <iostream>#include <string>using namespace std;class Object{private: string ms;public: Object(string s) { cout << “Object(string s) : " << s << endl; ms = s; } ~Object() { cout << “Object() : " << ms << endl; }};class Parent : public Object{private: string ms;public: Parent() : Object(“Default”) { cout << “Parent()” << endl; ms = “Default”; } Parent(string s) : Object(s) { cout << “Parent(string s) : " << s << endl; ms = s; } Object() : cc小结子类对象在创建时需要调用父类构造函数进行初始化先执行父类构造函数然后执行成员的构造函数父类构造函数显示调用需要在初始化列表中进行子类对象在销毁时需要调用父类析构函数进行处理以上内容参考狄泰软件学院系列课程,请大家保护原创!Parent() { cout << “Parent() : ccParent() : " << ms << endl; }};class Child : public Parent{private: Object mO1; Object mO2; string ms;public: Child() : mO1(“Default 1”), mO2(“Default 2”) { cout << “Child()” << endl; ms = “Default”; } Child(string s) : Parent(s), mO1(s + “1”), mO2(s + “2”) { cout << “Child(string s) : " << s << endl; ms = s; } Object() : cc1Child() { cout << “Object() : cc2Child() : " << ms << endl; }};int main(){ Child cc(“cc”); cout << endl; return 0;}输出:Object(string s) : ccParent(string s) : ccObject(string s) : cc1Object(string s) : cc2Child(string s) : ccChild() : cc