080e533122ee5d25172c99bdad1a0fbe.png

一、为什么需要虚函数?

根据类型兼容性规则可以得到一种常见情况,即当函数参数为父类指针时,可以使用子类指针来代替。

此时,就实现了代码重用,这个函数即可以用于子类,又可以用于父类对象。

但是,直接将函数参数中的父类用子类代替时,指针只能访问父类成员。如果想要指针访问子类对象的同名成员(同名、同参、同返回类型)则需在父类中将同名函数声明为虚函数

二、如何声明虚成员函数?

在C++中,虚函数对应的关键字为virtual。按照规定,虚函数必须在类定义中进行原型声明,而不是在函数实现时。其声明语法如下:

virtual 

三、虚函数何时起作用?

将成员函数声明为虚函数以后,必须使用指针或者引用,并且满足兼容性规则,才能实现正确的动态绑定。

必须注意的是,使用对象访问虚函数是不能实现多态的。因为对象名访问函数是在编译阶段进行绑定的,即为静态绑定。

四、不要重载非虚成员函数

对于父类的非虚成员函数,最好不要重载它们。

从反向考虑,想要被子类更改功能的函数,都被声明为虚函数,并让子类重写它们。如果没有声明为虚函数,说明这些函数的功能是不想被子类改动的。如果将非虚函数进行重写,子类指针和父类指针调用同名函数时,将容易造成混乱。

五、例子

(1)子类和父类的声明与实现

下面定义的父类Animal中,将eat()声明为虚成员函数;Duck类继承了Animal类,并将eat()再次声明为虚函数;BlackDuck类继承了Duck类,并将eat()声明为虚函数。

class 

(2)处理子类和父类指针的通用函数

下面定义的eat不是类成员函数,而是类外的函数,该函数以父类Animal的指针作为参数,可以调用子类和父类的指定虚函数:

void 
Logo

一站式 AI 云服务平台

更多推荐