假设我们有一个类A,还有几个它的子类B1,B2,B3。我们创建一个指针A*,要用它指向各子类的实例。
再假设我们有个函数func,各个子类对它都有实现。
这时候,指针A*虽然可以指向子类的实例,却无法调用子类的func函数。(注意这里分两种情况,一种是A没有实现func,一种是A也有func函数,但子类重写了它。这两种情况下A*都无法调用子类的func函数)
那么怎样让A*能调用子类的func函数呢?这就是要用到虚函数的时候了。我们在A里面把func函数声明为虚函数,那么当A*在运行时指向某一个子类的实例的时候,它调用的func就是这个子类实现的func。
那么纯虚函数呢?声明了纯虚函数会把类变成抽象类(无法用它实例化),并使得子类必须实现这个纯虚函数才能实例化。所以纯虚函数用来规范所有派生类必须实现某个接口。