目录
- 1. 名词辨析
- 2 含义解析
- 1 overload重载
- 2 override覆盖
- 3 overwrite重写
- 3 区别
- 4 代码示例
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函数,那么分以下几种情况:
- 子类的同名函数与父类的同名函数的返回值、参数列表都相同,这时就会发生override覆盖的情况(虽然没有显式声明override限定符)。
- 子类与父类的同名函数参数不同,返回值无论是否相同,发生重写;
- 子类与父类的同名函数参数相同,仅有返回值不同,编译无法通过;因为这时编译器会认为是想发生override,但是又不满足返回值相同或协变的要求;
另外,父类被重写的函数,可以通过添加类名限定符进行显式调用。
上图中,vscode中将override这一概念翻译为“重写”。
3 区别
- 如果是在相同的作用范围(全局范围,局部范围,或同一个类中),那么只能发生重载overload;
- 如果是分别在父类和子类中,并且父类函数没有virtual关键字,那么只能发生重写overwrite;
- 如果是分别在父类和子类中,并且父类函数有virtual关键字,那么需要根据函数的参数和返回值是否相同进行判断:
1.参数不同,是重写overwrite;
2. 参数相同,返回值相同,是覆盖override;
3. 参数相同,返回值不同, 编译错误!
4 代码示例
输出结果: