继承

继承的概念:

  1. 继承是一种创建新类的方式,新建的类可以继承一个或多个类,可以理解为子承父业,儿子拥有父亲的所有属性。
  2. 继承描述的是类和类之间的关系
  3. 新建的类被称之为派生(子)类,之前就存在的类,被称之为基(父)类
  4. 继承不受封装性的影响,不管是什么访问权限都会继承下来
  5. 继承的数据成员在内存的低地址,然后才是自己的成员

使用场景:
如果多个类之间存在大量重复的成员,可以考虑添加一个父类,将这些重复的成员放到父类中,然后继承父类,子类继承父类的所有成员
class Student:public People {...}

派生:
继承和派生是同一个过程,从不同角度看

  • 一个新类从已经存在的类那里获取其属性,叫做继承
  • 从一个已经存在的类产生一个子类,叫做派生

继承的方式:

class A{};
class B:public A{};//单继承
class C:public A,public B{};//多继承

继承下来的成员取原始访问权限和继承方式中较严格的权限

class B:protected A{};//如果父类中的那个成员是public继承方式是protected,protected小就取protected

封装:

  • private:在类外无法直接访问
  • protected:在类外无法直接访问,作为成员继承到子类中时,此时子类可以访问
    • 对外:像 private 一样,外界不能访问。
    • 对内和对子孙:像 public 一样,自己和派生类(子类)可以访问。
  • public:在类外无法直接访问
class People {
private:
    char* name;
protected:
    int age;
public:
	int id;
};
 
class Student:public People {
public:
    void fun(){
    a;//继承可以访问
    People A;//创建一个类对象,跟继承没关系
    A.name;//访问不到,私有
    A.age;//访问得到,如果是继承的可以访问
    A.id;//访问得到,公有
    }
};

子类对象可以当做父类对象来使用。也就是在函数参数列表写父类,我传进去子类也没问题

创建子类对象时先调用父类的构造函数,再调用子类的构造函数;死亡时先子后父

子类调用构造函数是默认调用父类的无参构造函数