码迷,mamicode.com
首页 > 编程语言 > 详细

【C++】三大概念要分清--重载,隐藏(重定义,覆盖(重写)

时间:2018-06-03 21:22:57      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:c++函数重载   语言   TE   public   image   IV   参考资料   stream   targe   

重载

技术分享图片

 

•  概念:在同一个作用域内;函数名相同,参数列表不同(参数个数不同,或者参数类型不同,或者参数个数和参数类型都不同),返回值类型可相同也可不同;这种情况叫做c++的重载!

  注意:c语言没有函数重载的机制

•  举例代码: 

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int Add(int a,int b)
 5 {
 6     return a+b;
 7 }
 8 
 9 float Add(float a,float b)
10 {
11     return a+b;
12 }
13 
14 int main()
15 {
16     cout<<Add(4,5)<<endl;       // 调用 int Add(int a,int b)
17     cout<<Add(2.5f,3.7f)<<endl; // 调用 float Add(float a,float b)
18     return 0;
19 }

此时,两个函数Add();在同一作用域,函数名相同都是Add,参数类型不同;就构成了c++中的函数重载;

• c++函数重载达到的效果:调用函数名相同的函数,会根据实参的类型和实参顺序以及实参个数选择相应的函数; 

• c++函数重载是一种静态多态(又叫做静态联编,静态绑定,静态决议)

 

 

覆盖(又叫重写)

技术分享图片

 

• 覆盖(重写)的前提条件:父类函数为虚函数;

• 覆盖(重写)的概念:当在子类中定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(也称覆盖)了父类的这个虚函数。

• 什么是在子类中定义了一个与父类完全相同的虚函数:

有两种情况:

1. 就是说子类中的虚函数和父类中的虚函数,函数名,参数个数,参数类型,返回值类型都相同;这种情况下子类的这个虚函数重写的父类中的虚函数,构成了重写;

2. 协变—是说子类中的虚函数和父类中的虚函数,函数名,参数个数,参数类型都相同,只是返回值类型不同;父类的虚函数返回父类的指针或者引用,子类虚函数返回子类的指针或者引用;这种情况下子类的这个虚函数也重写了父类中的虚函数,也构成了重写;——我们把这种特殊的情况叫做协变

【注意】:在基类中定义了一个与派生类虚函数完全相同的函数,那么这个派生类的函数就是重写了基类的虚函数,此时这个派生类的函数就是虚函数,如果不显示的加上virtual修饰,编译器也会默认为虚函数;

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class Person
 5 {
 6 public:
 7     virtual void BuyTickets()
 8     {
 9         cout << " 买票-全票" << endl;
10     }
11 protected:
12     string  _name; // 姓名
13 };
14 
15 class Student : public Person
16 {
17 public:
18     void BuyTickets()
19     {
20         cout << " 买票-半价" << endl;
21     }
22 protected:
23     int _num; //学号
24 };
25 
26 void Fun(Person* p)
27 {
28     p->BuyTickets();
29 }
30 
31 void Fun(Person &p)
32 {
33     p.BuyTickets();
34 }
35 
36 void Test()
37 {
38     Person p;
39     Student s;
40     Fun(p);
41     Fun(s);
42 
43     Fun(&p);
44     Fun(&s);
45 }
46 
47 int main()
48 {
49     Test();
50     system("pause");
51     return 0;
52 }

输出结果:

技术分享图片

 

举例2:

 1 #include<iostream>
 2 using namespace std;
 3 class Person
 4 {
 5 public:
 6     virtual  Person& BuyTickets()//基类虚函数
 7     {
 8         cout << "成人买票-全票" << endl;
 9         return *this;
10     }
11 public:
12     string  _name; // 姓名
13 };
14 
15 class Student : public Person
16 {
17 public:
18     virtual Student& BuyTickets()//派生类虚函数
19     {
20         cout << "学生买票-半票" << endl;
21         return *this;
22     }
23 public:
24     int _num; //学号
25 };
26 
27 void Fun(Person* p)
28 {
29     p->BuyTickets();
30 }
31 
32 void Fun(Person &p)
33 {
34     p.BuyTickets();
35 }
36 void Test()
37 {
38     Person p;
39     Student s;
40     Fun(p);
41     Fun(s);
42 
43     Fun(&p);
44     Fun(&s);
45 }
46 int main()
47 {
48     Test();
49     system("pause");
50     return 0;
51 }

输出结果:

技术分享图片

 

 

 

参考资料

1. c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)

 

 

【C++】三大概念要分清--重载,隐藏(重定义,覆盖(重写)

标签:c++函数重载   语言   TE   public   image   IV   参考资料   stream   targe   

原文地址:https://www.cnblogs.com/sunbines/p/9130227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!