蒋丽苑,C++重载、覆盖和遮蔽

本文详细介绍了C++中的函数重载、覆盖和遮蔽的区别。重载发生在同一作用域内,函数名相同但参数列表不同;覆盖发生在继承关系中,要求函数签名相同且为虚函数;遮蔽则是继承关系中同名但不构成覆盖的情况。通过示例代码解释了这些概念,强调了多态和编译期/运行期绑定的重要性。

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

多态函数是指在运行期才将函数入口地址与函数名绑定的函数,仅有虚函数才是多态。但是除了虚函数以外,重载和遮蔽同样具有函数名相同的特征,在此做一下区分。为了说明方便,我们引入函数签名这一概念。函数签名包括函数名和函数参数的个数、顺序以及参数数据类型。

例1:
void f( )
void g( )
void f(int)

例2:
void f( int)
void f(double)

例3:
void f(double, int)
void f(int, double)

为了理解函数签名的含义,我们先来看一下上面的三个例子。例1中函数f()和函数g()函数名不同,因此这两个函数的函数签名不同,f()函数和f(int)函数一个有参数,一个没有参数,函数签名同样不同,g()函数和f(int)函数函数名不同并且函数参数个数也不同,因此这两个函数的函数签名也是不相同的。例2中两个函数函数名相同,函数参数个数相同,但是函数参数的类型不同,因此这两个函数的函数签名也不是相同的。例3中的两个函数,函数名相同,函数参数个数相同,函数参数类型也是相同的,都是一个double类型和一个int类型的,只不过函数参数的顺序是不相同,如此一来这两个函数的函数签名同样是不相同的。

需要注意的是函数签名并不包含函数返回值部分,如果两个函数仅仅只有函数返回值不同,那么系统是无法区分这两个函数的,此时编译器会提示语法错误。

例4:
int f(int, double)
void f(int, double)

在本例中,两个函数的函数名相同,函数参数个数相同,函数参数类型相同,函数参数顺序相同,如此一来两个函数的函数签名是相同的。但是这两个函数的返回值不同,仅凭函数返回值,编译器无法区分这两个函数,编译器提示语法错误。

了解了函数签名的含义之后我们再来看一下重载、覆盖和遮蔽。

  1. 重载
    函数重载是指两个函数具有相同的函数名,但是函数参数个数或参数类型不同。函数重载多发生在顶层函数之间或者同一个类中,函数重载不需要构成继承关系。

例5:
class base
{
public :
base();
base(int a);
base(int a, int b);
base( base &);
int fun(int a);
int fun(do

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值