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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

080e533122ee5d25172c99bdad1a0fbe.png

一、为什么需要虚函数?

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

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

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

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

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

virtual 

三、虚函数何时起作用?

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

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

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

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

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

五、例子

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

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

class 

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

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

void 
### C++ 中 `override` 关键字的行为解析 当使用 `override` 声明成员函数时,这表明该成员函数意在覆盖基类中的虚函数。如果编译器发现这个标记为 `override` 的函数实际上并没有匹配任何基类虚函数,则会报错。因此,在遇到 `override` 无法重写基类成员的情况下,通常是因为以下几个原因: - **拼写错误**:派生类中函数名称、返回类型或者参数列表与基类不完全一致[^1]。 - **访问权限不同**:即使签名相同,但如果基类方法是私有的(private),那么它也不能被成功覆盖。 针对上述情况,解决方案如下: #### 确认函数签名一致性 确保派生类的方法具有相同的返回类型(协变返回类型除外)、名字以及形参列表,包括常量修饰符(const) 和引用(&) 符号都需保持一致[^2]。 ```cpp class Base { public: virtual void show() const { /* ... */ } }; // 正确的做法 class Derived : public Base { public: void show() const override { /* ... */ } // 返回类型和const限定词均应相匹配 }; ``` #### 检查继承关系及可见性 确认所要覆写的虚函数确实存在于直接或间接的基类之中,并且这些函数不是private级别的成员[^3]。 ```cpp class Animal { protected: // 改为保护级别以便子类能够访问并覆写 virtual void eat() {} }; class Dog : public Animal { public: void eat() override {} // 可见性和可访问的前提条件下才能覆写 }; ``` #### 使用工具辅助排查 利用现代IDE的强大功能来帮助定位问题所在;大多数集成开发环境都可以自动提示潜在的问题,比如未找到合适的虚函数供覆写等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值