1.虚函数的简介
由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。
虚函数主要通过V-Table虚函数表来实现,该表主要包含一个类的虚函数的地址表,可解决继承、覆盖的问题。当我们使用一个父类的指针去操作一个子类时,虚函数表就像一个地图一样,可指明实际所应该调用的函数。(每一个virtual函数的class都有一个相应的vtbl,当对象调用某一virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vtbl——编译器在其中寻找适当的函数指针。)
防止多重派生时,使用指针调用同名函数时已基类函数(父类)为准。
2.虚函数的核心概念
某基类中声明为virtual并在一个或多个派生类中重新定义的成员函数叫做虚函数。
3.虚函数的核心作用
- 实现动态联编,在函数运行阶段动态的选择合适的成员函数。
- 在定义了虚函数后,可实现在派生类中对虚函数进行重写,从而实现统一的接口和不同的执行过程。
我们通过三个虚函数的应用实例来说明虚函数的主要作用。
🌰继承关系中非虚函数:
#include <iostream>
using namespace std;
class A{
public:
A(){};
~A(){}