浅谈C++ overload(重载) override(覆盖) overwrite(重写)

1. 名词辨析

关于这3个名词的中文翻译:

  • overload翻译为重载,基本是没有歧义的;
  • override和overwrite的翻译,我在参考了cppreference中文网站的翻译之后,选择了它们的定义;网上有的帖子定义和我相反,应该是采取了另外的翻译方式方式,个人认为容易发生误解,因为overwrite翻译为重写非常符合直观上的理解;
  • https://zh.cppreference.com/w/cpp/language/override

2 含义解析

1 overload重载

指的是同一作用范围内的、具有不同参数列表(参数数目、参数类型、参数顺序)的同名函数。不关心返回值是否相同,不受virtual关键字影响。

与之相关的另一概念是操作符重载operator overloading。

2 override覆盖

在这里插入图片描述
上图中,cppreferrence网站将override翻译为“覆盖”。
如上所述,override是指派生类的一个虚函数覆盖父类的同名虚函数,要求派生类和父类的函数具有相同的名称、参数和返回值,并且还必须具备相同的const类型。

3 overwrite重写

重写也是派生类的函数和父类的函数具有相同名字的情况,但它不管函数参数是否相同,只要函数名字相同,就会发生重写。

但需要注意的是,如果父类的同名函数是virtual函数,那么分以下几种情况:

  1. 子类的同名函数与父类的同名函数的返回值、参数列表都相同,这时就会发生override覆盖的情况(虽然没有显式声明override限定符)。
  2. 子类与父类的同名函数参数不同,返回值无论是否相同,发生重写;
  3. 子类与父类的同名函数参数相同,仅有返回值不同,编译无法通过;因为这时编译器会认为是想发生override,但是又不满足返回值相同或协变的要求;

另外,父类被重写的函数,可以通过添加类名限定符进行显式调用。
在这里插入图片描述
上图中,vscode中将override这一概念翻译为“重写”。

3 区别

  1. 如果是在相同的作用范围(全局范围,局部范围,或同一个类中),那么只能发生重载overload;
  2. 如果是分别在父类和子类中,并且父类函数没有virtual关键字,那么只能发生重写overwrite;
  3. 如果是分别在父类和子类中,并且父类函数有virtual关键字,那么需要根据函数的参数和返回值是否相同进行判断:
    1.参数不同,是重写overwrite;
    2. 参数相同,返回值相同,是覆盖override;
    3. 参数相同,返回值不同, 编译错误!

4 代码示例

在这里插入图片描述

输出结果:
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值