久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2387|回復: 1
打印 上一主題 下一主題
收起左側

函數重載隱藏覆蓋的區別

[復制鏈接]
跳轉到指定樓層
樓主
ID:204624 發表于 2018-5-11 09:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.1 覆蓋隱藏重載
重載,隱藏(重定義),覆蓋(重寫)—這幾個名詞看著好像很像,不過其實一樣都不一樣!!
1.1.1 重載:
(1)
概念:在同一個作用域內;函數名相同,參數列表不同(參數個數不同,或者參數類型不同,或者參數個數和參數類型都不同),返回值類型可相同也可不同;這種情況叫做c++的重載!
注意:c語言沒有函數重載的機制;

(2)舉例:
#include<iostream>
using namespace std;
int Add(int a,int b)
{
   return a+b;
}
float Add(float a,float b)
{
   return a+b;
}
int main()
{
   cout<<Add(4,5)<<endl;//調用 int Add(int a,int b)
   cout<<Add(2.5f,3.7f)<<endl;//調用 float Add(float a,float b)
   return 0;
}

此時,兩個函數Add();在同一作用域,函數名相同都是Add,參數類型不同;就構成了c++中的函數重載;
(3)c++函數重載達到的效果:調用函數名相同的函數,會根據實參的類型和實參順序以及實參個數選擇相應的函數;
(4)c++函數重載是一種靜態多態(又叫做靜態聯編,靜態綁定,靜態決議)
1.1.2 覆蓋(又叫重寫)
(1)說覆蓋之前先說一個概念:
虛函數:類的成員函數前面加virtual關鍵字,則這個成員函數稱為虛函數
(2)覆蓋(重寫)的前提條件:父類函數為虛函數;
(3)覆蓋(重寫)的概念:當在子類中定義了一個與父類完全相同的虛函數時,則稱子類的這個函數重寫(也稱覆蓋)了父類的這個虛函數。
(4)什么是在子類中定義了一個與父類完全相同的虛函數:
有兩種情況:
1.就是說子類中的虛函數和父類中的虛函數,函數名,參數個數,參數類型,返回值類型都相同;這種情況下子類的這個虛函數重寫的父類中的虛函數,構成了重寫;
2、協變—是說子類中的虛函數和父類中的虛函數,函數名,參數個數,參數類型都相同,只是返回值類型不同;父類的虛函數返回父類的指針或者引用,子類虛函數返回子類的指針或者引用;這種情況下子類的這個虛函數也重寫了父類中的虛函數,也構成了重寫;——我們把這種特殊的情況叫做協變
注意:
在子類中定義了一個與父類虛函數完全相同的函數,那么這個子類的函數就是重寫了父類的虛函數,此時這個子類的函數就是虛函數,如果不顯示的加上virtual修飾,編譯器也會默認為虛函數;
(5)覆蓋(重寫)達到的效果:
1.在子類中重寫了父類的虛函數,那么子類對象調用該重寫函數,調用到的是子類內部重寫的虛函數,而并不是從父類繼承下來的虛函數;(這其實就是動態多態的實現);
2.在子類中重寫了父類的虛函數,如果用一個父類的指針(或引用)指向(或引用)子類對象,那么這個父類的指針或用引用調用該重寫的虛函數,調用的是子類的虛函數;相反,如果用一個父類的指針(或引用)指向(或引用)父類的對象,那么這個父類的指針或用引用調用該重寫的虛函數,調用的是父類的虛函數
(6)舉例1:普通重寫+函數重載
//普通重寫+函數重載
#include<iostream>
using namespace std;
class Person//父類
{
public:
   virtual void BuyTickets()//父類虛函數
   {
       cout<<" 買票-全票"<< endl;
   }
protected :
   string  _name; // 姓名
};
class Student : public Person//子類
{
public:
    void BuyTickets()//子類虛函數
   {
       cout<<" 買票-半價"<<endl ;
   }
protected :
   int _num ; //學號
};
void Fun (Person* p)
{
  p->BuyTickets();
}
void Fun (Person&p)
{
   p.BuyTickets();
}
void Test ()
{
   Person p ;
   Student s;
   Fun(p);
   Fun(s);
   Fun(&p);
   Fun(&s);
}
int main()
{
   Test();
   return 0;
}

1.1.3 隱藏(重定義)
(1)隱藏(重定義)概念:
是指在不同的作用域中(分別在父類和子類中),函數名相同,不能構成重寫的都是重定義。
(2)隱藏(重定義)的使用范圍:
重定義的不光是類的成員函數,還可以是類的成員變量;
(3)隱藏(重定義)的直接效果:
如果在父類和子類中有相同名字的成員;那么在子類中。會將父類的成員隱藏;隱藏以后的直接效果就是:無論在子類的內部或者外部(通過子類成員)訪問該成員;全都是訪問子類的同名成員;如果在子類內部或者外部(通過子類成員)訪問同名的成員函數,則需要根據函數調用的規則來調用子類的同名成員函數;否則調用失敗;
#include<iostream>
using namespace std;
class A
{
protected:
   A(int x=2)
       :_a(x)
   {}
//public:
//  //1
//     void show()
//  {
//      cout<<"A::shou()"<<endl;
//  }
//public:
//  //2
//  virtual void show()
//  {
//      cout<<"A::shou()"<<endl;
//  }
public:
   //3
   void show(int a)
   {
       cout<<"A::shou()"<<endl;
   }
public:
   int _a;
};
class B:public A
{
public:
   B(int x=1)
       :_a(x)
   {}
//public:
//  //1
//  void show(int b)
//  {
//      cout<<"B::shou()"<<endl;
//  }
//public:
//  //2
//  void show(int a)
//  {
//      cout<<"B::shou()"<<endl;
//  }
public:
   //3
   void show(int a,int b)
   {
       cout<<"B::shou()"<<endl;
       cout<<_a<<endl;
   }
public:
   int _a;
};
int main()
{
   B b;
   cout<<(b._a)<<endl;
   b.show(1);
   return 0;
}

程序中所標明的1,2,3三種情況都是成員隱藏!



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:204624 發表于 2018-5-16 09:33 | 只看該作者
更多學習資料扣群 524872455
WEIXIN 13360509869
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产99免费 | 一区二区不卡 | 国产精品久久久久久久久久 | 亚洲综合色丁香婷婷六月图片 | 91视频免费视频 | 亚洲一区二区视频在线播放 | 国产精品三级 | 99re99| 欧美一级欧美一级在线播放 | 亚洲欧洲中文 | 亚洲一区二区精品 | 欧美在线网站 | 久久久www成人免费无遮挡大片 | 久久精品中文字幕 | 日韩成人在线视频 | 黄色大片在线视频 | 免费三级av | 日日操夜夜操天天操 | 9久久精品 | 在线观看国产 | 99久久精品免费看国产四区 | 91青青草视频 | 日日夜夜操天天干 | 国产福利在线 | 日韩欧美一区二区三区免费观看 | 99精品99| 啪视频在线 | 欧美精品一区二区三区在线播放 | 婷婷毛片 | 久久综合888 | 国产1区2区3区 | 久久久久久久久99精品 | 亚洲色图婷婷 | 亚洲一页 | 综合色播 | 99久久亚洲| 波多野结衣一区二区三区在线观看 | 国产精品99久 | 91精品中文字幕一区二区三区 | 91看片在线观看 | 久久精品日产第一区二区三区 |