C++ 笔记 关于多态的跟java不一样的使用方法
2017-02-25 13:49
253 查看
多态
使用面向对象语言的时候,熟练的运用多态是必须的。虽然我最早学的是C/C++,但是那个时候学的都是皮毛,入了个门而已,真正深入的理解面向对象语言是从JAVA开始的。JAVA是一个非常人性化的语言,易学易用,其中多态的使用也非常容易理解。但是C++里面,虽然功能上相对于JAVA没有任何差别,但是使用起来貌似要更复杂一点。
1,基类和子类的函数调用区别
JAVA:
//SuperClass 扩展出 MyClass SuperClass cls = new MyClass; cls.func;//这里调用的是MyClass的func()方法
C++
//SuperClass 扩展出 MyClass SuperClass* cls = new MyClass; cls->func;//这里调用的是SuperClass的func()方法
说明:JAVA语言里面没有指针/引用/函数名的概念,只有一种使用方式,类似于C++的“引用”,所以直接用 “ . ”操作就可以了。
而C++里面,有“指针/引用/函数名”三种概念,点操作针对的是函数名调用和引用调用。如果要使用多态,只支持“引用/指针”两种操作模式,推荐使用指针模式,因为引用模式也使用“.”操作符,会产生二义性。
在没有任何设置的情况下,C++里面对于函数的调用是调用指针类型里面的函数。如上面这样:
cls是SuperClass类型,虽然创建并指向了一个MyClass,但是调用依然是SuperClass里面的对应函数。
为了实现调用子类里面的函数,需要将这个函数设置为虚函数,也就是
virtual func();
只需要在声明里设置就可以了。
2,关于析构函数的调用
因为C++有析构函数和手动
delete的概念,所以一些操作跟JAVA也不一样。
如上所述,只有设置为虚函数的函数才会按照创建的实例来调用,否则会按照指针类型来调用。
所以,当调用
delete cls的时候,只会自动调用
SuperClass的析构函数,不会调用
MyClass的析构函数。
所以为了调用MyClass的析构函数,需要将SuperClass的析构函数设置为虚函数
virtual ~SuperClass();
这样,所有子类也会继承为虚函数,那么,MyClass的析构函数都会被调用。
virtual关键字会被子类继承,即便子类没有声明virtual也是如此
但是,最好子类也标记virtual,为了让源代码更清晰。
3,纯虚函数/抽象类
纯虚函数相当于JAVA里面的抽象函数”abstract class”
只需要在声明的时候增加”=0即可”
virtual void mFunc() = 0;
不需要提供实现。包含纯虚函数的类就是抽象类,这个名称倒是跟JAVA一样。
相关文章推荐
- JAVA中关于set()和get()方法的理解及使用
- C++ 关于 CMFCPropertyGridCtrl 的使用方法
- 关于使用JAVA调用c 或者c++的DLL的吐槽
- Java学习笔记90. 使用迭代方法访问类集
- 关于Java的String.split方法的具体使用方法
- Java多线程中关于join方法的使用实例解析
- 1. Rccp简明教程(关于R与C++的混合使用方法)
- 关于Java的同步Synchronized的使用,在这做下笔记。
- C++/Java 实现多态的方法(Java)
- Java学习笔记43. 使用对象作为方法的参数
- Java学习笔记2:当构造方法有多个参数时考虑使用Builder
- 【慕课笔记】第七章 方法 第3节 JAVA中无参带返回值方法的使用
- cocos2d-x使用jni java调用c++方法(java 调 c++)
- JNI进阶一 (C++调用java属性和方法,javap的使用)
- 关于使用cmd编译java文件出现乱码现象解决方法
- 1.JAVA中使用JNI调用C++代码学习笔记
- 关于使用java调用海康威视的动态库的详细使用说明(即java调用海康威视SDK的方法)
- (2.1.25)关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)
- Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法
- JAVA中关于set()和get()方法的理解及使用