继承是面向对象三大特性之一
定义这些类时下级别的成员除了拥有上一级的共性,还有自己的特性
这个时候我们就可以考虑利用继承的技术,减少重复代码

一、继承的基本语法

示例:

  1. #include <iostream>
  2. using namespace std;
  3. class BasePage
  4. {
  5. public:
  6. void header()
  7. {
  8. cout << "首页、分类、查找。。" << endl;
  9. }
  10. void tips()
  11. {
  12. cout << "帮助、合作、站内地图.." << endl;
  13. }
  14. };
  15. class java :public BasePage //class java 继承 class BasePage
  16. {
  17. public:
  18. void content()
  19. {
  20. cout << "java视频页面" << endl;
  21. }
  22. };
  23. class CPP :public BasePage //class CPP 继承 class BasePage
  24. {
  25. public:
  26. void content()
  27. {
  28. cout << "CPP视频页面" << endl;
  29. }
  30. };
  31. void test()
  32. {
  33. java ja;
  34. ja.header(); //通过继承获取到的BasePage类下的成员函数
  35. ja.content();
  36. ja.tips(); //通过继承获取到的BasePage类下的成员函数
  37. CPP cpp;
  38. cpp.header();
  39. cpp.content();
  40. cpp.tips();
  41. }
  42. int main()
  43. {
  44. test();
  45. }

结果:
image.png

二、继承方式

继承的语法:class 子类(派生类): 继承方式(public、private、portected)父类(基类)

继承方式一共有三种:

  • 公共继承
  • 保护继承
  • 私有继承

image.png

三、继承中构造和析构顺序

子类继承父类后,当创建子类对象,也会调用父类的构造函数
问题:父类和子类的构造和析构顺序是谁先谁后?

示例:

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. Base()
  7. {
  8. cout << "Base构造函数的调用" << endl;
  9. }
  10. ~Base()
  11. {
  12. cout << "Base析构函数的调用" << endl;
  13. }
  14. };
  15. class Son :public Base
  16. {
  17. public:
  18. Son()
  19. {
  20. cout << "Son类构造函数的调用" << endl;
  21. }
  22. ~Son()
  23. {
  24. cout << "Son类析构函数的调用" << endl;
  25. }
  26. };
  27. void test()
  28. {
  29. Son s;
  30. }
  31. int main()
  32. {
  33. test();
  34. }

结果:
image.png

四、继承中同名成员处理方式

问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?

  • 访问子类同名成员 直接访问可
  • 访问父类同名成员 需要加作用域

    五、继承同名静态成员处理方式

    问题:继承中同名的静态成员在子类对象上如何进行访问?
    静态成员和非静态成员出现同名,处理方式一致

  • 访问子类同名成员 直接访问即可

  • 访问父类同名成员 需要加作用域

    六、多继承语法

    C++允许一个类继承多个类
    语法:class 子类 : 继承方式 父类1 ,继承方式 父类2…….
    多继承可能会引发父类中有同名成员出现,需要加作用域区分
    C++实际开发中不建议用多继承

    七、菱形继承

    概念:两个派生类继承同一个基类,又有某个类同时继承这两个派生类,这种继承被称为菱形继承,或者钻石继承。
    菱形继承的问题:

  • 羊继承了动物的数据,驼同样继承了动物的数据,当羊驼使用数据时,就会产生二义性

  • 羊驼继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以

利用虚继承来解决,加virtual
示例:

  1. class Animal{};
  2. class sheep : virtual public Animal{};
  3. class tuo : virtual public Animal{};
  4. class sheeptuo : public sheep,public tuo;