1.简单的派生类的构造函数

    • 例:

      1. #include <iostream>
      2. #include<string>
      3. using namespace std;
      4. class Student//声明基类Student
      5. {public:
      6. Student(int n,string nam,char s) //基类构造函数
      7. {num=n;
      8. name=nam;
      9. sex=s; }
      10. ~Student( ){ } //基类析构函数
      11. protected: //保护部分
      12. int num;
      13. string name;
      14. char sex ;
      15. };
      16. class Student1: public Student //声明派生类Student1
      17. {public: //派生类的公用部分
      18. Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)
      19. {age=a; //在函数体中只对派生类新增的数据成员初始化
      20. addr=ad;
      21. }
      22. void show( )
      23. {cout<<″num: ″<<num<<endl;
      24. cout<<″name: ″<<name<<endl;
      25. cout<<″sex: ″<<sex<<endl;
      26. cout<<″age: ″<<age<<endl;
      27. cout<<″address: ″<<addr<<endl<<endl;
      28. }
      29. ~Student1( ){ } //派生类析构函数
      30. private: //派生类的私有部分
      31. int age;
      32. string addr;
      33. };
      34. int main( )
      35. {Student1 stud1(10010,″Wang-li″,′f′,19,″115 Beijing Road,Shanghai″);
      36. Student1 stud2(10011,″Zhang-fun″,′m′,21,″213 Shanghai Road,Beijing″); stud1.show( ); //输出第一个学生的数据
      37. stud2.show( ); //输出第二个学生的数据
      38. return 0;
      39. }
      • 派生累构造函数首行写法:

    Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)
    image.png

    • 可以将派生类构造函数在类外面定义,而在类体中只写该函数的声明:

      1. Student1int nstring namchar sint astring ad);
      • 在类的外面定义派生类构造函数:

        1. Student1 Student1int nstring nam,char s,int astring ad):Studentnnams
        2. {age=a;
        3. addr=ad; }
      • 注意: **此时,在类中对派生类构造函数作声明时,不包括基类构造函数名及其参数表列(即Studentnnams))。只在定义函数时才将它列出**。

        • 调用基类构造函数时的实参是从派生类构造函数的总参数表中得到的,也可以直接使用常量或全局变量。
        • 不仅可以利用初始化表对构造函数的数据成员初始化,而且可以利用初始化表调用派生类的基类构造函数,实现对基类数据成员的初始化。
          1. Student1(string namchar sint astring ad): Student(10010nams){ }

    2.有子对象的派生类的构造函数

    • 类的数据成员中还包含类对象;

      1. #include <iostream>
      2. #include <string>
      3. using namespace std;
      4. class Student//声明基类
      5. {public: //公用部分
      6. Student(int n, string nam ) //基类构造函数,与例11.5相同
      7. {num=n;
      8. name=nam;
      9. }
      10. void display( ) //成员函数,输出基类数据成员
      11. {cout<<″num:″<<num<<endl<<″name:″<<name<<endl;}
      12. protected: //保护部分
      13. int num;
      14. string name;
      15. };
      16. class Student1: public Student //声明公用派生类Student1
      17. {public:
      18. Student1(int n, string nam,int n1, string nam1,int a, string ad)
      19. :Student(n,nam),monitor(n1,nam1) //派生类构造函数
      20. {age=a;
      21. addr=ad; }
      22. void show( )
      23. {cout<<″This student is:″<<endl;
      24. display(); //输出num和name
      25. cout<<″age: ″<<age<<endl; //输出age
      26. cout<<″address: ″<<addr<<endl<<endl; //输出addr
      27. }
      28. void show_monitor( ) //成员函数,输出子对象
      29. {cout<<endl<<″Class monitor is:″<<endl;
      30. monitor.display( ); //调用基类成员函数
      31. }
      32. private: //派生类的私有数据
      33. Student monitor; //定义子对象(班长)
      34. int age;
      35. string addr;
      36. };
      37. int main( )
      38. {Student1 stud1(10010,″Wang-li″,10001,″Li-sun″,19,″115 Beijing Road,Shanghai″);
      39. stud1.show( ); //输出学生的数据
      40. stud1.show_monitor(); //输出子对象的数据
      41. return 0;
      42. }
      • 派生类构造函数的任务包括:
        • 对**基类数据成员**初始化;
        • 对**子对象数据成员**初始化;
        • 对**派生类数据成员**初始化。
      • 程序中派生类构造函数首部如下:
        1. Student1(int n, string nam,int n1, string nam1,int a, string ad):
        2. Student(n,nam),monitor(n1,nam1)
    • 定义派生类构造函数的一般形式为

    派生类构造函数名(总参数表列)**: **基类构造函数名(参数
    表列),子对象名**(参数表列)
    {派生类中新增数成员据成员初始化语句**}
    image.png

    3.多层派生时的构造函数**

    • 例:多级派生情况下派生类的构造函数

      1. #include <iostream>
      2. #include<string>
      3. using namespace std;
      4. class Student//声明基类
      5. {public: //公用部分
      6. Student(int n, string nam ) //基类构造函数
      7. {num=n;
      8. name=nam; }
      9. void display( ) //输出基类数据成员
      10. {cout<<″num:″<<num<<endl;
      11. cout<<″name:″<<name<<endl; }
      12. protected: //保护部分
      13. int num; //基类有两个数据成员
      14. string name; };
      15. class Student1:public Student
      16. {public:
      17. Student1(int n,char nam[10],int a):Student(n,nam) {age=a; }
      18. void show( )
      19. {display( );
      20. cout<<″age: ″<<age<<endl; }
      21. private:
      22. int age;
      23. };
      24. class Student2:public Student1 //声明间接公用派生类Student2
      25. {public: Student2(int n, string nam,int a,int s):Student1(n,nam,a)
      26. {score=s; }
      27. void show_all( ) //输出全部数据成员
      28. {show( ); //输出num和name
      29. cout<<″score:″<<score<<endl; //输出age
      30. }
      31. private:
      32. int score; //增加一个数据成员
      33. };
      34. int main( )
      35. {Student2 stud(10010,″Li″,17,89);
      36. stud.show_all( ); //输出学生的全部数据
      37. return 0;
      38. }
      • 在执行Student2构造函数时,先调用Student1构造函数;在执行Student1构造函数时,先调用基类Student构造函数。
      • 初始化的顺序
        • 先初始化基类的数据成员num和name。
        • 再初始化Student1的数据成员age。
        • 最后再初始化Student2的数据成员score。



    4.派生类构造函数的特殊形式