我是靠谱客的博主 丰富嚓茶,这篇文章主要介绍C/C++—— C++中函数重写和函数重载,现在分享给大家,希望可以做个参考。

函数重载

1.必须在同一个类中进行。
2.子类无法重载父类的函数,父类同名函数将被名称覆盖。
3.重载是在编译期间根据参数类型和个数决定函数调用。

如果父类中有函数:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
void func() { cout<<"Parent01:void func()"<<endl; } virtual void func(int i) { cout<<"Parent:void func(int i)"<<endl; } virtual void func(int i, int j) { cout<<"Parent:void func(int i, int j)"<<endl; }

子类中有函数:

复制代码
1
2
3
4
5
6
7
8
void func(int i, int j) { cout<<"Child:void func(int i, int j)"<<" "<<i + j<<endl; } void func(int i, int j, int k) { cout<<"Child:void func(int i, int j, int k)"<<" "<<i + j + k<<endl; }

定义子类Child c;
问题1:c.func();可以执行吗??
答案是不能:因为子类无法重载父类的函数,父类同名函数将被名称覆盖。子类中的func(int, int j);和func(int i, int j, int k);将父类中的func()函数覆盖了。
如果想调用父类的func()函数,需要执行c.Parent01::func();加上函数的类限定符.

函数重写

1.必须发生于父类与子类之间。
2.并且父类与子类中的函数必须有完全相同的原型。
3.使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)。
4.多态是在运行期间根据具体对象的类型决定函数调用。

在上面例子中:子类中的func(int, int j);和func(int i, int j, int k);重写了父类中的这两个函数(因为这两个函数是虚函数)。

测试案例:

复制代码
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cstdlib> #include <iostream> using namespace std; class Parent01 { public: Parent01() { cout<<"Parent01:printf()..do"<<endl; } public: void func() { cout<<"Parent01:void func()"<<endl; } void abcd() { cout<<"Parent01:void func()"<<endl; } virtual void func(int i) { cout<<"Parent:void func(int i)"<<endl; } virtual void func(int i, int j) { cout<<"Parent:void func(int i, int j)"<<endl; } }; //重写的两种情况 //如果函数重写,在父类中增加了virtual关键字, 将能产生多态。。。。 //如果函数重写,没有加virtual关键字,,相当于在子类中重定义。。。。。,不会发生多态。。。 class Child01 : public Parent01 { public: //原因是发生了 名称覆盖,把子类中的没有函数参数的,这个函数abcd名称覆盖了。。。 //在子类中,是不能重载父类的函数的。编译器就是这么做的,顺从。。。。 void abcd(int a, int b) { cout<<"Parent01:void func()"<<endl; } //此处2个参数,和子类func函数是什么关系 void func(int i, int j) { cout<<"Child:void func(int i, int j)"<<" "<<i + j<<endl; } //此处3个参数的,和子类func函数是什么关系 void func(int i, int j, int k) { cout<<"Child:void func(int i, int j, int k)"<<" "<<i + j + k<<endl; } }; void run01(Parent01* p) { p->func(1, 2); } int main() { /* Parent01 p; p.func(); p.func(1); p.func(1, 2); */ Child01 c; //c.Parent01::abcd(); //这个函数是从父类中继承而来 可以使用。。。 //子类和父类有相同的名字(变量名字或者是函数名字的时,子类名字覆盖父类名字,如果想使用父类的资源,需要加::) //c.Parent01::func(); //问题1 这个函数是从父类中继承而来,为什么这个地方不能使用 c.Parent01::func(); //问题1 //c.func(1, 2); /* run01(&p); run01(&c); */ return 0; } //问题1:child对象继承父类对象的func,请问这句话能运行吗?why //c.func(); //1子类里面的func无法重载父类里面的func //2当父类和子类有相同的函数名、变量名出现,发生名称覆盖 //3//c.Parent::func(); //问题2 子类的两个func和父类里的三个func函数是什么关系?

最后

以上就是丰富嚓茶最近收集整理的关于C/C++—— C++中函数重写和函数重载的全部内容,更多相关C/C++——内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部