
一、为什么需要虚函数?
根据类型兼容性规则可以得到一种常见情况,即当函数参数为父类指针时,可以使用子类指针来代替。
此时,就实现了代码重用,这个函数即可以用于子类,又可以用于父类对象。
但是,直接将函数参数中的父类用子类代替时,指针只能访问父类成员。如果想要指针访问子类对象的同名成员(同名、同参、同返回类型),则需在父类中将同名函数声明为虚函数。
二、如何声明虚成员函数?
在C++中,虚函数对应的关键字为virtual。按照规定,虚函数必须在类定义中进行原型声明,而不是在函数实现时。其声明语法如下:
virtual
三、虚函数何时起作用?
将成员函数声明为虚函数以后,必须使用指针或者引用,并且满足兼容性规则,才能实现正确的动态绑定。
必须注意的是,使用对象访问虚函数是不能实现多态的。因为对象名访问函数是在编译阶段进行绑定的,即为静态绑定。
四、不要重载非虚成员函数
对于父类的非虚成员函数,最好不要重载它们。
从反向考虑,想要被子类更改功能的函数,都被声明为虚函数,并让子类重写它们。如果没有声明为虚函数,说明这些函数的功能是不想被子类改动的。如果将非虚函数进行重写,子类指针和父类指针调用同名函数时,将容易造成混乱。
五、例子
(1)子类和父类的声明与实现
下面定义的父类Animal中,将eat()声明为虚成员函数;Duck类继承了Animal类,并将eat()再次声明为虚函数;BlackDuck类继承了Duck类,并将eat()声明为虚函数。
class
(2)处理子类和父类指针的通用函数
下面定义的eat不是类成员函数,而是类外的函数,该函数以父类Animal的指针作为参数,可以调用子类和父类的指定虚函数:
void