class 派生类名:继承方式1 基类名1,继承方式2 基类名2,...
公有继承 public:派生类中可以直接访问基类中的public和protected,通过派生类的对象只能访问基类的public,基类的private是都不能
私有继承 private:基类的public和protected在派生类中都变成private,在派生类内看作private来用,通过派生类对象就都不能访问
保护继承 protected:基类的public和protected在派生类中都变成 protected,在派生类内看作protected来用,但是通过派生类对象都不能访问(protected给的权限是对于子类的,对外界算是private)
也就是,基类的 public、protected 对于派生类都是可以用的,但是在派生类中的级别就要看本身的级别和继承的级别里较严的那一个,派生类的对象可不可用还要看继承的级别。而基类的 private 对于子类来说是一定用不了的。
类型兼容
父类指针能指向子类对象,但是子类指针不能指向父类对象。因为子类可能含有一些父类没有的成员变量或者方法函数,但是子类肯定继承了父类所有的成员变量和方法函数。私有或保护派生类也不行,因为在子类里是私有或保护的,但是在父类里不是,就会出问题。
构造和析构
- 构造函数不被继承,派生类中需要声明自己的构造函数
- 只要初始化自己新增的成员,对基类的会自动调用基类的构造函数
派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表), 本类成员初始化列表
- 基类构造函数的调用顺序是按照被继承时声明的顺序(从左向右)
- 析构函数也不被继承,得自行声明;系统会自动隐式调用基类的析构函数。析构函数的调用次序与构造函数相反。
虚继承
- 派生类从多个基类派生,而这些基类又从同一个基类派生,同样基类的成员数据和函数就会有多份,就会有冲突
- 虚继承就是在派生类中只保留一份间接基类的成员
- 继承的时候用 virtual 修饰
- 为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝(即最远的那个派生类在调基类里共同的成员的时候,会直接访问那个虚基类的成员)
- 在第一级继承的时候就要把共同基类设计为虚基类
- 虚派生只影响从指定了虚基类的派生类中进一步派生出来的类,它不会影响派生类本身