重写和重定义

重写

  • override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同
  • 被重写的函数不能是static的,必须是virtual的
  • 重写函数必须有相同的类型,名称和参数列表
  • 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为public、protect也是可以的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <iostream>
using namespace std;
class A
{
public:
virtual void toprint() {cout << "A"<< endl;}
};

class B : public A
{
public:
void toprint() { cout << "B"<< endl;}
};

class C : public A
{
public:
void toprint() { cout << "C"<< endl;}
};

int main()
{
B b;
b.toprint();
C c;
c.toprint();
return 0;
}

重定义

  • 派生类对基类的成员函数重新定义,即派生类定义了某个函数,该函数的名字与基类中函数名字一样。
  • 重定义也叫做隐藏,子类重定义父类中有相同名称的非虚函数(参数可以不同)。如果一个类,存在和父类相同的函数,那么这个类将会覆盖其父类的方法,除非你在调用的时候,强制转换为父类类型,否则试图对子类和父类做类似重载的调用时不能成功的。
  • 不在同一个作用域(分别位于基类、派生类)
  • 函数的名字必须相同
  • 对函数的返回值、形参列表无要求
  • 若派生类定义该函数与基类的成员函数完全一样(返回值、形参列表均相同),且基类的该函数为virtual,则属于派生类重写基类的虚函数
  • 若重新定义了基类中的一个重载函数,则在派生类中,基类中该名字函数(即其他所有重载版本)都会被自动隐藏,包括同名的虚函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <iostream>
using namespace std;
class A
{
public:
void toprint() {cout << "A"<< endl;}
void toprint(int a) {cout << a << endl;}
};

class B : public A
{
public:
void toprint() { cout << "B"<< endl;}
};

class C : public A
{
public:
void toprint() { cout << "C"<< endl;}
};

int main()
{
B b;
b.toprint();
C c;
c.toprint();
//c.toprint(10); //报错,toprint(int a)被隐藏
return 0;
}


重写和重定义
https://carl-5535.github.io/2022/03/21/C++/重写和重定义/
作者
Carl Chen
发布于
2022年3月21日
许可协议