继承
有些类与类之间存在特殊关系
好处,减少重复代码
语法
class 子类:继承方式 父类
子类也成为派生类,父类也成为基类
编写:
继承
总结
继承方式
公共继承,保护继承,私有继承
细节
1、在父类私有的变量,在子类中依然访问不到
2、父类除私有外的变量,到子类中,会根据子类的继承方式,访问方式有所区别
继承中对象模型
父类中所有的属性,都会被子类继承下去,不管它是不是私有的,在子类中,父类私有的只是被编译器进行隐藏了。
查看对象模型下的布局
继承中构造和析构顺序
子类继承父类之后,当创建子类对象,也会调用父类的构造函数
继承中同名成员处理
当子类与父类出现同名(属性或者函数名相同)的成员,如何通过子类对象,访问到子类或父类中同名的数据
访问子类同名成员 直接访问即可
访问父类同名成员,需要加作用域
注 如果子类中出现和父类同名的成员函数(不管参数列表相不相同),子类的同名成员隐藏掉父类中所有同名成员函数
同名的静态成员处理方法
一样,加作用域即可
两种方法
同名静态属性
同样的 子类出现了和父类同名的静态成员函数,子类会将父类的静态成员函数全都覆盖掉,到时候就加作用域就好
多继承
多继承可能会引发父类中有同名的出现,需要加作用域区分
不太赞成多继承操作
菱形继承
两个派生类,继承一个基类
又有某个类同时继承着两个派生类
菱形继承带来的问题
1、羊继承了动物的数据,驼也继承了动物的数据,当马使用数据时,不知道改用谁的产生了二义性
解决:
加上作用域
2、马继承了两份同名属性,但只需要一份即可
解决:
继承之前加上关键字virtual 变为虚继承
animal类成为虚基类(最大的继承)
sheeptuo继承了两个父类,成员属性会有个虚基类指针,指向虚基类,这样的话,访问父类age,相当于就是访问虚基类,同时age的值,是最近的那个赋值为准