使用“override”声明的成员函数不能重写基类成员_C++日志(四十一)干货!带你搞懂什么是虚函数!...

深入理解C++虚函数:实现多态的关键
本文详细介绍了C++中的虚函数,包括为什么需要虚函数、如何声明虚成员函数、虚函数何时起作用,以及为什么不应重载非虚成员函数。通过实例解析了虚函数在多态中的应用,强调了使用‘override’声明的成员函数与基类虚函数的关系。

080e533122ee5d25172c99bdad1a0fbe.png

一、为什么需要虚函数?

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

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

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

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

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

virtual 

三、虚函数何时起作用?

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

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

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

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

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

五、例子

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

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

class 

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

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

void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值