虚函数与多态
1. 定义
虚函数的作用是为了实现多态的机制。
多态
:用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这样可以实现“多种形态”,这是一种泛型技术。
2. 虚函数表
每个含有虚函数的类都有一个虚函数表(Virtual Table),C++编译器应该保证虚函数表的指针存在于对象实例中最前面
的位置(这是为了保证取到虚函数表的有最高的性能—–如果有多重继承情况)。这就意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应函数。
- 每一个类都有一个虚函数表;
- 虚表可以继承,即使子类没有重写虚函数,子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。如果基类有三个虚函数,那么基类的虚表中就会有三项(虚函数地址),派生类也会有虚表,至少有三项。如果重写了其中的虚函数,那么虚表中的地址就会改变,指向自身实现的虚函数实现。如果派生类就自己新实现的虚函数,那么就在虚表中添加一项。
- 派生类的虚表中虚函数地址排列顺序和基类的虚表中虚函数地址排列顺序是一样的,子类独有的虚函数则放在后面。
当定义一个有虚函数的类的对象时,对象的第一块内存空间就是一个指向虚表的指针。