多态
- 多态,即多种状态(形态)。简单来说,我们可以将多态定义为消息以多种形式显示的能力。
- 多态是以封装和继承为基础的
- C++多态分类及实现
-
- 重载多态(Ad-hoc Polymorphism,编译期):函数重载、运算符重载
- 子类型多态(Subtype Polymorphism,运行期):虚函数
- 参数多态性(Parametric Polymorphism,编译期):类模版、函数模版
- 强制多态(Coercion Polymorphism,编译期/运行期):基本类型转换、自定义类型转换
- Java多态的两种实现形式
-
- 继承:对于引用子类的父类类型,在处理该引用时,它适用于继承该父类的所有子类,子类对象的不同,对方法的实现也就不同,执行相同动作产生的行为也就不同
- 接口:继承是通过重写父类的同一方法的不同子类来体现的,那么就可通过实现接口覆盖接口中的同一方法的不同的类型体现的。
静态多态(编译器/早绑定)
函数重载
class A { public: void do(int a); void do(int a, int b); };
动态多态
- 虚函数:用virtual修饰成员函数,使其成为虚函数
- 动态绑定:当使用基类的引用或指针调用一个虚函数时将发生动态绑定
注意:
- 可以将派生类的对象赋值给基类的指针或引用,反之不可
- 普通函数(非类成员函数)不能时虚函数
- 静态函数(static)不能是虚函数
- 构造函数不能是虚函数(因为在调用构造函数时,虚表指针并没有在对象的内存空间中,必须要构造函数调用完成后才会形成虚表指针)
- 内联函数不能是表现多态的虚函数,解释见:虚函数(virtual)可以是内联函数(inline)吗?
动态多态的使用
class Shape // 形状类 { public: virtual double calcArea() { ... } virtual ~Shape(); }; class Circle : public Shape // 圆形类 { public: virtual double calcArea(); ... }; class Rect : public Shape // 矩形类 { public: virtual double calcArea(); ... }; int main() { Shape * shape1 = new Circle(4.0); Shape * shape2 = new Rect(5.0, 6.0); shape1->calcArea(); // 调用圆形类里面的方法 shape2->calcArea(); // 调用矩形类里面的方法 delete shape1; shape1 = nullptr; delete shape2; shape2 = nullptr; return 0; }
评论