继承:
定义子类:
只需要一个冒号就是继承,demo的运行结果:
先运行父类的构造函数,再运行子类的走在函数。如果在子类实现同样的方法,会重写父类的方法,只输出子类方法的打印日志。
如果要调用父类的方法怎么办呢?
这三种方式都是调用父类的fly方法。
虚函数:让派生类重载父类的方法
运行的结果:
并没有调用子类自己的方法而是调用了父类的方法,怎么才能调用子类自己的方法,这就用到了虚函数。
只需要给父类Plane.h头文件里的方法加上virtual关键字就可以了,主意:1、只需要父类添加这个关键字,子类不需要。2、fun2方法是一个引用传递,而不是值传递。值传递即使加了virtual关键字还是会调用父类的方法。还有一种方式就是直接使用指针,Jet jet = new jet(),这样会有指针的释放。
多继承的二义性:
假如一个父类classA 并且有一个属性name,子类classA1,classA2都继承A,一个classB同时继承A1和A2,在B中给name赋值,就会出现继承的二义性,因为不知道这个name是A1还是A2的,路径不明确。
如果解决这个问题呢?
使用虚继承,解决路径不明确的问题,使多个继承的同名成员,只有一份拷贝。
继承导致可能存在内存泄漏:
运行结果:
只运行了父类的析构函数,并没有运行子类的析构函数,如果在之类的构造函数中动态申请的内存是没有被释放的。如何解决呢?
给父类的析构函数 添加virtual。
接口:
如果子类,没有实现纯虚函数,那么它也是一个抽象类,否则不是抽象类,可以实例化。
友元:
友元函数:
运行结果:
不可以直接修改age,需要通过modify方法修改。
友元类:
模板函数:
运行结果:
数据交换了,简直就是java中的泛型。也可以像java 那样搞泛型类。
类型转换:
1、普通值类型的转换
2、const值转换(去常量)
运行结果:
3、子类和父类之间的转换dynamic_cast
4、函数指针的转换reinterpret_cast 不常用 不通用。