c++ Overload、 Override 和 Overwrite
-
- Overload 重载
- 同名不同参,注意参数有无const也视为不同
- 仅返回值不同,不构成重载
- 构成重载的各个函数具有相同的作用域。处于同一文件/全局域/namespace 内的同名不同参函数;对类成员函数,则发生在同一类域中。(基类和派生类之间不构成重载)
- Override 覆盖
- 不同作用域:分别位于基类和派生类
- 基类函数必须为vitrual函数,而派生类函数和基类虚函数同名同参
- Overwrite 隐藏
- 派生类和基类函数同名不同参,不论基类函数是否是vitrual,派生类函数被隐藏
- 派生类和基类非vitrual函数同名同参,基类函数被隐藏
- 三者之间区分
- overload是同一个类中的成员函数间的水平关系;而override/overwrite都是派生类和基类间的垂直关系
- override覆盖的前提或特点是基类函数必须为virtual
- override覆盖的结果是根据对象类型决定调用哪个函数(多态);而Overwrite隐藏则表现为根据指针类型决定调用哪个函数,这是覆盖和隐藏最直观的区别。
#include <stdio.h> #include <iostream> class Parent { public: void F() { printf("Parent.F()/n"); } virtual void G() { printf("Parent.G()/n"); } int Add(int x, int y) { return x + y; } //重载(overload)Add函数 float Add(float x, float y) { return x + y; } }; class ChildOne:Parent { //重写(overwrite)父类函数 void F() { printf("ChildOne.F()/n"); } //覆写(override)父类虚函数,主要实现多态 void G() { printf("ChildOne.G()/n"); } }; int main() { ChildOne childOne;// = new ChildOne(); Parent* p = (Parent*)&childOne; //调用Parent.F() p->F(); //实现多态 p->G(); Parent* p2 = new Parent(); //重载(overload) printf("%d/n",p2->Add(1, 2)); printf("%f/n",p2->Add(3.4f, 4.5f)); delete p2; system("PAUSE"); return;
- Overload 重载
-
我们的项目是不是没有用到过overwrite,不太了解
-
@sp 用到过
-
@ruisongzhou 哪个文件里面?