JNI——C++基础二

继承:

JNI——C++基础二_第1张图片
先定义一个父类

定义子类:


JNI——C++基础二_第2张图片


只需要一个冒号就是继承,demo的运行结果:

JNI——C++基础二_第3张图片

先运行父类的构造函数,再运行子类的走在函数。如果在子类实现同样的方法,会重写父类的方法,只输出子类方法的打印日志。

如果要调用父类的方法怎么办呢?

JNI——C++基础二_第4张图片

这三种方式都是调用父类的fly方法。

虚函数:让派生类重载父类的方法


JNI——C++基础二_第5张图片

运行的结果:

JNI——C++基础二_第6张图片

并没有调用子类自己的方法而是调用了父类的方法,怎么才能调用子类自己的方法,这就用到了虚函数。


JNI——C++基础二_第7张图片

只需要给父类Plane.h头文件里的方法加上virtual关键字就可以了,主意:1、只需要父类添加这个关键字,子类不需要。2、fun2方法是一个引用传递,而不是值传递。值传递即使加了virtual关键字还是会调用父类的方法。还有一种方式就是直接使用指针,Jet jet = new jet(),这样会有指针的释放。

多继承的二义性:

假如一个父类classA 并且有一个属性name,子类classA1,classA2都继承A,一个classB同时继承A1和A2,在B中给name赋值,就会出现继承的二义性,因为不知道这个name是A1还是A2的,路径不明确。


多继承

如果解决这个问题呢?

虚继承

使用虚继承,解决路径不明确的问题,使多个继承的同名成员,只有一份拷贝。

继承导致可能存在内存泄漏:

JNI——C++基础二_第8张图片


JNI——C++基础二_第9张图片

运行结果:

JNI——C++基础二_第10张图片

只运行了父类的析构函数,并没有运行子类的析构函数,如果在之类的构造函数中动态申请的内存是没有被释放的。如何解决呢?

JNI——C++基础二_第11张图片

给父类的析构函数 添加virtual。

接口:


JNI——C++基础二_第12张图片

如果子类,没有实现纯虚函数,那么它也是一个抽象类,否则不是抽象类,可以实例化。

友元:

友元函数:

JNI——C++基础二_第13张图片

运行结果:

不可以直接修改age,需要通过modify方法修改。

友元类:

JNI——C++基础二_第14张图片

模板函数:

JNI——C++基础二_第15张图片

运行结果:

数据交换了,简直就是java中的泛型。也可以像java 那样搞泛型类。

类型转换:

1、普通值类型的转换

JNI——C++基础二_第16张图片

2、const值转换(去常量)

JNI——C++基础二_第17张图片

运行结果:

3、子类和父类之间的转换dynamic_cast

JNI——C++基础二_第18张图片

4、函数指针的转换reinterpret_cast 不常用 不通用。

你可能感兴趣的:(JNI——C++基础二)