Intro
面向对象的编程范式有三大特性
- 封装
- 继承
- 多态
其中多态机制就是靠虚函数(virtual function)来实现的。所谓的多态,在代码层的表现就是:
- 用父类型的指针指向其子类的实例,
- 然后通过父类指针的来实际调用子类的成员函数
这种技术,可以让统一的父类的指针具有“多种形态”,故称为多态。这是一种泛型技术。所谓的泛型技术,就是试图使用不变的代码来实现可变的算法。比如模板技术,RTTI技术,这里说的虚函数技术,最终的函数状态,要么等到编译时决定,要么等到运行时决定。
虚函数
定义时候这样写
class Parent
{
public:
virtual void foo() {cout << "I am too old." << endl;}
}
class Child
{
public:
virtual void foo() {cout << "I am too yound." << endl;}
}
调用时候这样写,
Parent* p = new Child();
p->foo();
输出结果是
I am too yound.
在调用的时候,我们使用的是指向 Parent 类型的指针,调用的却是 Child 中的函数。
纯虚函数
virtual void foo () = 0;
纯虚函数带动整个类虚化,成为抽象类。均只有定义,无法实例化。必须有子类继承之后才能各自去做实例化。一般用来定义顶层的抽象类。如 Fruit
就可以定义为一个抽象类, Apple, Banana 可以定义为其的子类。
Ref
- c++虚函数的使用方法:基本定义
- C++虚函数 : 讲解非常细腻,足量实例代码
- c++中的虚函数: 讲解透彻,图表生动,汇编精彩。把虚函数表讲透了
- C++纯虚函数: 总结的非常好