第11章继承与派生(编辑修改稿)内容摘要:

~ Student( )。 Manager::Manager(const stringamp。 n, int d, int lvl) : family_name(n), // error: family_name not declared in manager department(d), // error: department not declared in manager level(lvl) { // ... } 派生类的构造函数只能描述它自己的成员和自己的直接基类的初始式,它不能直接去初始化基类的成员。 简单的派生类的构造函数 有子对象的派生类的构造函数  类的数据成员中可以包含类对象,如 : Student s1。  s1就是类对象中的内嵌对象,称为子对象,即对象中的对象。 例 包含子对象的派生类的构造函数。 include iostream include string using namespace std。 class Student {public: //公用部分 Student(int n, string nam ) //基类构造函数 {num=n。 name=nam。 } void display( ) {cout″num:″numendl″name:″nameendl。 } protected: //保护部分 int num。 string name。 }。 class Student1: public Student //声明公用派生类 Student1 {public: Student1(int n, string nam,int n1, string nam1,int a, string ad) :Student(n,nam),monitor(n1,nam1) //派生类构造函数 {age=a。 addr=ad。 } void show( )。 void show_monitor( )。 //成员函数,输出子对象 private: //派生类的私有数据 Student monitor。 //定义子对象 (班长 ) int age。 string addr。 }。 void Student1:: show( ) {cout″This student is:″endl。 display()。 //输出 num和 name cout″age: ″ageendl。 //输出 age cout″address: ″addrendlendl。 //输出 addr } void Student1::show_monitor( ) {coutendl″Class monitor is:″endl。 ( )。 //调用基类成员函数 } int main( ) {Student1 stud1(10010,″Wangli″,10001,″Lisun″,19,″115 Beijing Road,Shanghai″)。 ( )。 //输出学生的数据 ()。 //输出子对象的数据 return 0。 } 有子对象的派生类的构造函数 派生类构造函数的任务应该包括 3个部分 : ( 1) 对基类数据成员初始化; ( 2) 对子对象数据成员初始化; ( 3) 对派生类数据成员初始化。 有子对象的派生类的构造函数 执行派生类构造函数的顺序是 : ① 调用基类构造函数,对基类数据成员初始化; ② 调用子对象构造函数,对子对象数据成员初始化; ③ 再执行派生类构造函数本身,对派生类数据成员初始化。 多层派生时的构造函数 一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。 例 多级派生情况下派生类的构造函数。 include iostream includestring using namespace std。 class Student {public: //公用部分 Student(int n, string nam ) //基类构造函数 {num=n。 name=nam。 } void display( ) //输出基类数据成员 {cout″num:″numendl。 cout″name:″nameendl。 } protected: //保护部分 int num。 //基类有两个数据成员 string name。 }。 class Student1: public Student {public: Student1(int n,char nam[10],int a):Student(n,nam) {age=a。 } void show( ) //输出 num, name和 age {display( )。 //输出 num和 name cout″age: ″ageendl。 } private: //派生类的私有数据 int age。 //增加一个数据成员 }。 class Student2:public Student1 {public: Student2(int n, string nam,int a,int s):Student1(n,nam,a) { score=s。 } void show_all( ) //输出全部数据成员 { show( )。 //输出 num和 name cout″score:″scoreendl。 //输出 age } private: int score。 //增加一个数据成员 }。 int main( ) {Student2 stud(10010,″Li″,17,89)。 ( )。 //输出学生的全部数据 return 0。 } 派生关系如图所示 派生类构造函数的特殊形式 1. 当不需要对派生类新增的成员进行任何初始化操作时,派生类构造函数的函数体可以为空。 2. 如果在基类中构造函数没有参数,那么在定义派生类构造函数时可不写基类构造函数。 3. 如果在基类和子对象类型的声明中都没有定义带参数的构造函数,而且也不需对派生类自己的数据成员初始化,则可以不必显式地定义派生类构造函数。 派生类构造函数的特殊形式 4. 如果在基类或子对象类型的声明中定义了带参数的构造函数,那么就必须显式地定义派生类构造函数,并在派生类构造函数中写出基类或子对象类型的构造函数及其参数表。 5. 如果在基类中既定义无参的构造函。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。