C++中的重载和覆盖,还有(隐藏)

本文详细介绍了C++中的函数重载(overload)、覆盖(override)以及所谓的“隐藏”概念。重载允许在同一个作用域内函数名相同但形参列表不同,而覆盖是在继承中子类函数对基类同名虚函数的重新定义。文中通过实例阐述了如何判断重载、覆盖,并澄清了“隐藏”并非C++的正式规则。
摘要由CSDN通过智能技术生成

前言

重载(overload)和覆盖(override)是C++中关于函数的两个基础概念,但是如果让你说出他们具体的描述和区别,一下子还真是不太容易说的很清楚和全面,这里简单把记录一下,作为备忘。关于隐藏我觉得是个误解,C++中根本没有隐藏的说法和规则。

重载

重载(overload)是指同一个作用域内几个函数名字相同,但形参列表不同(包括参数个数、类型、参数顺序)。注意:函数返回值不是作为区分重载函数的标志。

定义重载函数

定义以下几个函数:

void print(const char *cp);
void print(const int *beg, const int *end);
void print(const int ia[], size_t size);

这些函数的名字一样,形参个数和类型不一样。当调用这些函数时,编译器会根据传递的实参类型推断调用的是哪个函数:

int ary[2] = {0, 1};
print("Hello world");           // 调用print(const char *)
print(j, end(ary) - begin(ary));// 调用print(const int, size_t)
print(begin(ary), end(ary));    // 调用print(const int *, const int *)

两个函数除了返回类型不同,其他所有要素都相同的话,第二个函数的声明是错误的,例如:

void print(const char *cp);
bool print(const char *cp); // 错误
判断两个形参的类型是否相异

有些函数的形参列表看起来不一样,实际上是一样的:

Record lookup(const Account &acct);
Record lookup(const Account&);

typedef Phone Telno;
Record lookup(const Phone&);
Record lookup(const Telno&);

第一对声明中,在函数的声明中形参没有实质的含义,有没有它不会影响形参列表的内容。
第二对声明,typedef是已存在的类型提供了另外一个名字,并不创建新的类型,因此,第二对中两个函数本质上没有不同。

重载和const形参
顶层const(top-level const) 底层const(low-level const)
-- 顶层const和底层const的概念参见《C++ Primer》第五版 2.4.3小节

顶层const不影响传入函数的对象。一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来。

Record lookup(Phone);
Record lookup(const Phone);  // 重复声明

Record lookup(Phone*);
Record lookup(Phone* const); // 重复声明

上面两组函数声明,每一组的两个都是等价的。

Record lookup(Accout&);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值