继承
继承的概念:
- 继承是一种创建新类的方式,新建的类可以继承一个或多个类,可以理解为子承父业,儿子拥有父亲的所有属性。
- 继承描述的是类和类之间的关系
- 新建的类被称之为派生(子)类,之前就存在的类,被称之为基(父)类
- 继承不受封装性的影响,不管是什么访问权限都会继承下来
- 继承的数据成员在内存的低地址,然后才是自己的成员
使用场景:
如果多个类之间存在大量重复的成员,可以考虑添加一个父类,将这些重复的成员放到父类中,然后继承父类,子类继承父类的所有成员
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;//访问得到,公有
}
};子类对象可以当做父类对象来使用。也就是在函数参数列表写父类,我传进去子类也没问题
创建子类对象时先调用父类的构造函数,再调用子类的构造函数;死亡时先子后父
子类调用构造函数是默认调用父类的无参构造函数