C++中Overload、Overwrite和Override的区别

1、Overload(重载):几个函数使用相同的名字,但参数或返回值不同:

  • 相同的范围(在同一个类中)
  • 函数名字相同
  • 参数不同(若只有返回值不同,则不能构成重载)
  • virtual关键字可有可无

2、Override(覆盖):派生类函数覆盖基类函数:

  • 不同的范围(分别位于派生类与基类)
  • 函数名字相同
  • 参数相同(返回值类型也要相同)
  • 基类函数必须有virtual关键字

3、Overwrite(重写):派生类的函数屏蔽了与其同名的基类函数:

  • 不同的范围(分别位于派生类与基类)
  • 函数名字相同(返回值类型可以不同)
  • 若参数不同,不论基类函数有无virtual关键字
  • 若参数相同,基类函数无virtual关键字

示例如下:

#include <stdio.h>

class Parent
{
public:
void func() {
printf("Parent.func()\n");
}

virtual void vFunc() {
printf("Parent.vFunc()\n");
}

virtual int add(int x, int y) {
printf("Parent.add()\n");
return x + y;
}

// 重载(overload)add函数
double add(double x, double y) {
printf("Overload: Parent.add()\n");
return x + y;
}
};

class Child: public Parent
{
public:
// 重写(overwrite)父类函数
int func() {
printf("Child.func()\n");
return 0;
}

// 覆盖(override)父类虚函数,实现多态
void vFunc() {
printf("Child.vFunc()\n");
}
};

int main()
{
Parent *pp = new Parent();
pp->func(); // Parent.func()
pp->vFunc(); // Parent.vFunc()

pp->add(1, 2); // Parent.add()
pp->add(1.0, 2.0); // Overload: Parent.add()

pp = new Child();
pp->func(); // Parent.func()
pp->vFunc(); // Child.vFunc()

return 0;
}

0%