目的减少重复代码冗余
Class 子类(派生类) : 继承方式 父类(基类)
继承方式共有三种:公共、保护、私有
父类的私有成员private无论哪种继承方式都不可以被子类使用
保护protected权限的内容在类内是可以访问,但是在类外访问不到
保护继承和私有继承的继承方式是并行的,父类的非私有方式全变为保护/私有
子类所占用的内存空间要计算上父类的成员:(private也会被继承下去,只是不可以访问)
上述代码输出是16,即打印子类的内存占用包括了ABCD四个成员的内容
关于 父类和子类的构造和析构顺序:
调用子类时:
父类构造函数 》》》》 子类构造函数 》》》》 子类析构函数 》》》》 父类析构函数
继承同名成员处理方式:
访问子类同名成员, 直接访问即可
访问父类同名成员, 需要加父类作用域
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数,即使父类中存在独有的函数重载,也不能直接访问
如果想访问到父类中被隐藏的同名成员函数,需要加作用域
继承同名静态成员的处理方式:
与上述一致
访问子类同名成员, 直接访问即可
访问父类同名成员, 需要加父类作用域
与上面不同的是,静态成员不属于任一对象,除了可以通过对象访问还可以直接通过类名访问
总结: 同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式 (通过对象 和 通过类名)
多继承语法:
允许一个类继承多个类,但是开发过程中不建议使用多继承
多继承可能会引发父类中有同名成员出现,需要加作用域区分
菱形继承:
两个派生类继承同一个基类,又有某个类同时继承者两个派生类
这种继承被称为菱形继承,或者钻石继承
父类
↙ ↘
子类1 子类2
↘ ↙
子类3
当子类1继承了父类的数据,子类2也继承了父类,当子类3使用数据时,会产生二义性
子类3继承来自父类的数据一共两次,但是实际一次就可以
当菱形继承,对于子类3 来说两个父类(子类1和子类2)拥有相同数据,需要加以作用域区分.但是数据两份资源浪费
解决方案:虚继承可以解决问题,在两个子类(子类1和子类2)继承前加上关键字virtual变为虚继承,父类成为虚基类
当发生虚继承时,共同的数据变成了一份,不会出现不明确的情况,其值按照程序运行顺序取最后的赋值,同时访问共同的数据可以不用在前面加作用域,
即原来:
子类3 zi3;
cout << zi3.子类1:: age<<endl;
cout <<zi3.子类2:: age <<endl;
现在用了虚继承:
cout << zi3.age <<endl; //直接访问即可
注意:需要在两个继承的子类(子类1和子类2)前面都要加上virtual关键字