这里先说下为什么会用到虚函数:
以下面的程序为例:
这个程序中,Carp是Fish的继承类,而Carp中覆盖了Swim这个方法,在MakeFishSwim这个函数中,要使用Fish类的形参,而你将yourFish这个Carp类的实参传递给了这个函数,让他执行Swim这个函数,这会发生什么,上面的程序运行结果:
这说明了什么?说明在MakeFishSwim这个程序中,它定义它的形参是Fish类型的,虽然你将yourFish这个Carp类传到了它那里,它仍然认为yourFish是Fish类的,并调用了Fish类Swim。
显然我们的初衷并不是这样,是希望对应的类执行自己的方法,那怎么避免这种情况呢?这就需要虚函数了。
虚函数的定义很简单,直接在方法定义最前面加上关键字“virtual”即可!举例:
虚函数最大的重要作用在于,对于析构函数,如果没有虚函数,delete将不会作用到派生类中的析构函数,会造成资源未释放,内存泄漏等隐患。
抽象基类和纯虚函数
不能被实例化的基类被称为抽象基类,这样的基类只有一个用途,那就是用它来派生出其他类,可使用纯虚函数的声明来创建纯虚函数。
值得注意的是:声明抽象基类后 1. 派生类必须声明相应的方法;2. 不能再对这个基类实例化
附上一个Shape, Circle,Triangle的例子: