C++ VS Java
表述方法
数据/属性和函数/方法修饰符
- 一般是同一种权限的数据和函数写一起
- 一般都是每个函数分别写
布尔类型
继承
-
C++
-
Java
- public class A extends B{}
- 权限问题
- 构造函数
多态
-
C++
-
函数重载:静态多态(编译时多态)
- 是指在程序编译时系统就能够确定要调用的是哪个函数,也被称为编译时多态。
- 通过函数的重载(overload)及运算符重载来实现。——通过参数区分
- 函数重载注意事项
- 不能仅靠函数的返回值来区别重载函数,必须从形式参数上区别开来。
- 不同参数传递方式也无法区别重载函数
- 由typedef定义的类型别名并没有真正创建一个新的类型
- 实现
- 类中重载成员函数(java中称为方法重载)
- 派生类中的同名成员函数(java称为方法重写)
- 例子
-
虚函数
- 关联
- 静态关联
- 静态关联(static binding)在运行前进行的关联
- 又称为早期关联。
- 动态关联
- 动态关联(dynamic binding)在编译后执行该过程
- 也被称为滞后关联
- 定义
- C++中的虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或者基类引用来访问这个同名函数。
- 注意以下两点:
- 1.virtual只能使用在类定义的函数原型声明中,不能在成员函数实现的时候使用,也不能用来限定类外的普通函数。
- 2.用virtual声明类的非静态的成员函数,只用于类的继承层次结构中。不能将类外的普通函数(友员)和静态成员函数声明成虚函数。
- 使用虚函数的几点说明:
- virtual具有继承性,在派生类覆盖基类虚成员函数时,既可使用也可不用virtual来限定,二者没有差别,默认派生类中的重写函数是具有virtual的。
- 在派生类中重新定义虚函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数完全相同。否则不能实现多态性, 为函数重载.
-
虚析构函数
- 注意
- 构造函数不能是虚函数
- 建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数
- 析构函数可以是虚函数
- 虚析构函数用于指引 delete 运算符正确析构动态对象
- 当基类的析构函数为虚函数时,无论指针指的是同一类族的哪一个类对象,对象撤销时,系统会采用动态关联,调用相应的析构函数,完成该对象的清理工作。
- 习惯把析构函数声明为虚函数,即使基类并不需要析构函数,以确保撤销动态存储空间时能够得到正确的处理。
-
纯虚函数与抽象类
- 纯虚函数
- 在许多情况下,在基类中不能给出有意义的虚函数定义,这时可把它说明成纯虚函数,把它的定义留给派生类来做。
- 纯虚函数的作用
- 在基类中为其派生类保留一个函数的名字。以便派生类根据需要对它进行定义, 否则无法实现多态性。
- 纯虚函数不具备函数的功能,一般不能直接被调用。
- 从基类继承来的纯虚函数,在派生类中仍是虚函数。
- 抽象类(不必显式定义)
- 如果一个类中至少有一个纯虚函数, 那么这个类被称为抽象类(abstract class)。
- 抽象类中不仅包括纯虚函数,也可包括虚函数。
- 注意1
(1). 抽象类必须用作派生其他类的基类可使用指向抽象类的指针支持运行时多态性。而不能用于直接创建对象实例。 (2) 派生类中应重写基类中的纯虚函数,否则派生类仍将被看作一个抽象类。 - 注意2
(1) 一个基类如果包含一个或一个以上纯虚函数,就是抽象基类。抽象基类不能也不必实例化对象。 (2) 抽象基类一般并不是现实存在的对象的抽象,可以没有任何物理上的或其他实际意义方面的含义 (3) 在类的层次结构中,顶层或最上面的几层可以是抽象基类。抽象基类体现了本类族中各类的共性,把各类中共有的成员函数集中在抽象基类中声明。 -
Java
|