C++中谈重载、覆盖、和隐藏

本文通过示例代码详细解析了C++中的函数重载、覆盖与隐藏的区别,并从作用域及函数原型的角度进行了总结。

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

在学习C++的时候,在了解到多态类(存在虚函数的类)的时候我知道了有关对象模型的概念,在剖析了有关对象模型的知识后,对于其中的派生类继承一个多态基类的时候,会对父类的虚函数进行重写,重写也就是所谓的覆盖掉继承自父类的函数,将自己的对象模型中的相应的虚函数的槽位改为自己的函数,但是问题来了,我们之前学习了函数的重载,还有继承中的函数隐藏,这些到底有什么区别?所以做以下的整理希望能帮到在这里迷惑的你

首先写一段代码

#include<iostream>
using namespace std;


class Base
{
	virtual void h()
	{
		cout << "Base" << endl;
	}
	virtual void g();   //基类中的两个g()构成的是重载
	void g(int i);
	void j();
};

class D :public Base
{
	virtual void h()    //重写父类的函数
	{
		cout << "D" << endl;
	}
	virtual void g(float f);   //隐藏父类的函数
	void g(int i);             //隐藏父类的函数

};
上面的代码中写出来了函数重载、覆盖、隐藏的三种关系

我通过下面几个条件来区分他们

1.作用域

函数重载:相同的作用域,发生在一个类体内

函数覆盖:不同的作用域,发生在基类和派生类中

函数隐藏:不同的作用域,发生在基类和派生类中

2.函数原型

函数重载:在同个类体中,函数名相同,返回值和参数不同(两个可都不同也可一者不同)

函数覆盖:函数原型必须相同(协变不做考虑),函数名和参数都相同

函数隐藏:如果函数原型相同但是基类函数不是virtual;如果函数名相同,但是参数列表不同不管基类有无virtual关键字

做以下总结:

重载是发生在一个类体中的函数名相同,参数列表或者返回值不同的不同函数;

覆盖是在派生类中的与基类函数原型相同的派生类函数对基类函数的重写;

隐藏是派生类中的与基类不是虚函数的函数原型相同、和与基类的虚函数函数名形同参数列表不同的函数的隐藏。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值