首先要了解派生类调用构造函数过程:基类构造函数–>派生类构造函数

    1.基类有默认构造函数,派生类未显示调用时,派生类自动调用基类的默认构造函数;

    1. #include <iostream>
    2. using namespace std;
    3. class Father
    4. {
    5. public:
    6. Father()
    7. {
    8. cout << "基类默认构造函数!\n";
    9. }
    10. };
    11. class Children : public Father
    12. {
    13. public:
    14. Children()
    15. {
    16. cout << "派生类构造函数!\n" << endl;
    17. }
    18. };
    19. int main(int argc, char** argv)
    20. {
    21. Children rec;
    22. return 0;
    23. }

    2.基类有默认构造函数,派生类显示调用时,派生类自动调用基类的默认构造函数;

    1. #include <iostream>
    2. using namespace std;
    3. class Father
    4. {
    5. public:
    6. Father()
    7. {
    8. cout << "基类默认构造函数!\n";
    9. }
    10. };
    11. class Children : public Father
    12. {
    13. public:
    14. Children() : Father()
    15. {
    16. cout << "派生类构造函数!\n" << endl;
    17. }
    18. };
    19. int main(int argc, char** argv)
    20. {
    21. Children rec;
    22. return 0;
    23. }

    3.基类没有默认构造函数,派生类显示调用时,派生类会调用系统为基类生成的默认构造函数;

    1. #include <iostream>
    2. using namespace std;
    3. class Father
    4. {
    5. public:
    6. // Father()
    7. // {
    8. // cout << "基类默认构造函数!\n";
    9. // }
    10. };
    11. class Children : public Father
    12. {
    13. public:
    14. Children() : Father()
    15. {
    16. cout << "派生类构造函数!\n" << endl;
    17. }
    18. };
    19. int main(int argc, char** argv)
    20. {
    21. Children rec;
    22. return 0;
    23. }

    4.基类没有默认构造函数,派生类未显示调用时,派生类会调用系统为基类生成的默认构造函数;

    1. #include <iostream>
    2. using namespace std;
    3. class Father
    4. {
    5. public:
    6. // Father()
    7. // {
    8. // cout << "基类默认构造函数!\n";
    9. // }
    10. };
    11. class Children : public Father
    12. {
    13. public:
    14. Children()// : Father()
    15. {
    16. cout << "派生类构造函数!\n" << endl;
    17. }
    18. };
    19. int main(int argc, char** argv)
    20. {
    21. Children rec;
    22. return 0;
    23. }

    5.基类有带参数的构造函数,也有默认构造函数,派生类未显示调用基类构造函数时,派生类会调用基类默认构造函数;

    1. #include
    2. using namespace std;
    3. class Father
    4. {
    5. public:
    6. Father()
    7. {
    8. cout << “基类默认构造函数!\\n”;
    9. }
    10. Father(int nNum)
    11. {
    12. cout << “基类传参构造函数!\\n”;
    13. }
    14. };
    15. class Children : public Father
    16. {
    17. public:
    18. Children()
    19. {
    20. cout << “派生类构造函数!\\n << endl;
    21. }
    22. };
    23. int main(int argc, char\*\* argv)
    24. {
    25. Children rec;
    26. return 0;

    }
    6.基类有带参数的构造函数,也有默认构造函数,派生类显示调用基类一种构造函数时,派生类会调用基类该种构造函数;

    1. #include <iostream>
    2. using namespace std;
    3. class Father
    4. {
    5. public:
    6. Father()
    7. {
    8. cout << "基类默认构造函数!\n";
    9. }
    10. Father(int nNum)
    11. {
    12. cout << "基类传参构造函数!\n";
    13. }
    14. };
    15. class Children : public Father
    16. {
    17. public:
    18. Children() : Father(1)
    19. {
    20. cout << "派生类构造函数!\n" << endl;
    21. }
    22. };
    23. int main(int argc, char** argv)
    24. {
    25. Children rec;
    26. return 0;
    27. }

    错误方式:
    基类仅写了带参数的构造函数,没写不带参数的默认构造函数时,而派生类又没有显示调用基类构造函数时,编译失败。因为基类写了构造函数,系统就不会为基类生成默认构造函数,派生类想调用基类的默认构造函数时找不到;

    1. #include <iostream>
    2. using namespace std;
    3. class Father
    4. {
    5. public:
    6. // Father()
    7. // {
    8. // cout << "基类默认构造函数!\n";
    9. // }
    10. Father(int nNum)
    11. {
    12. cout << "基类传参构造函数!\n";
    13. }
    14. };
    15. class Children : public Father
    16. {
    17. public:
    18. Children()// : Father()
    19. {
    20. cout << "派生类构造函数!\n" << endl;
    21. }
    22. };
    23. int main(int argc, char** argv)
    24. {
    25. Children rec;
    26. return 0;
    27. }

    如果觉得派生类调用基类构造函数情况太多,不好记忆,那么每次写派生类构造函数时最好显示调用基类构造函数!