国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > C++ > 正文

C++之普通成員函數、虛函數以及純虛函數的區別與用法要點

2020-05-23 14:17:41
字體:
來源:轉載
供稿:網友

本篇文章主要介紹了C++中的普通成員函數、虛函數以及純虛函數,非常的詳細,有需要的朋友可以參考下

普通成員函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的“字面值”類對象,調用自己的普通函數;虛函數為了重載和多態的需要,在基類中定義的,即便定義為空;純虛函數是在基類中聲明的虛函數,它可以再基類中有定義,且派生類必須定義自己的實現方法。

假設我們有三個類Person、Teacher、Student它們之間的關系如下:

C++之普通成員函數、虛函數以及純虛函數的區別與用法要點

類的關系圖

普通成員函數

【Demo1】

根據這個類圖,我們有下面的代碼實現

 

 
  1. #ifndef __OBJEDT_H__ 
  2. #define __OBJEDT_H__ 
  3.  
  4. #include <string> 
  5. #include <iostream> 
  6.  
  7. class Person 
  8. public
  9. Person(const string& name, int age) : m_name(name), m_age(age) 
  10.  
  11. void ShowInfo() 
  12. cout << "姓名:" << m_name << endl; 
  13. cout << "年齡:" << m_age << endl; 
  14.  
  15. protected
  16. string m_name; //姓名 
  17. int m_age; //年齡 
  18. }; 
  19.  
  20.  
  21. class Teacher : public Person 
  22. public
  23. Teacher(const string& name, int age, const string& title) 
  24. : Person(name, age), m_title(title) 
  25.  
  26. void ShowInfo() 
  27. cout << "姓名:" << m_name << endl; 
  28. cout << "年齡:" << m_age << endl; 
  29. cout << "職稱:" << m_title << endl; 
  30.  
  31. private
  32. string m_title; //職稱 
  33. }; 
  34.  
  35. class Student : public Person 
  36. public
  37. Student(const string& name, int age, int studyId) 
  38. : Person(name, age), m_studyId(studyId) 
  39.  
  40. void ShowInfo() 
  41. cout << "姓名:" << m_name << endl; 
  42. cout << "年齡:" << m_age << endl; 
  43. cout << "學號:" << m_studyId << endl; 
  44.  
  45. private
  46. int m_studyId; //學號 
  47. }; 
  48.  
  49. #endif //__OBJEDT_H__ 

測試代碼:

 

 
  1. void test() 
  2. Person* pPerson = new Person("張三", 22); 
  3. Teacher* pTeacher = new Teacher("李四", 35, "副教授"); 
  4. Student* pStudent = new Student("王五", 18, 20151653); 
  5. pPerson->ShowInfo(); 
  6. cout << endl; 
  7. pTeacher->ShowInfo(); 
  8. cout << endl; 
  9. pStudent->ShowInfo(); 
  10. cout << endl; 
  11. delete pPerson; 
  12. delete pTeacher; 
  13. delete pStudent; 

結果:

姓名:張三

年齡:22

姓名:李四

年齡:35

職稱:副教授

姓名:王五

年齡:18

學號:20151653

說明:

這里的ShowInfo就是一個普通的函數。pPerson、pTeacher和pStudent三個對象調用ShowInfo分別展示自己的信息。

我們知道:父類的指針是可以指向子類的對象的。我們把上面的測試代碼稍微改一下:

【Demo2】

 

 
  1. void test() 
  2. Person* pPerson = new Person("張三", 22); 
  3. Person* pTeacher = new Teacher("李四", 35, "副教授"); 
  4. Person* pStudent = new Student("王五", 18, 20151653); 
  5. pPerson->ShowInfo(); 
  6. cout << endl; 
  7. pTeacher->ShowInfo(); 
  8. cout << endl; 
  9. pStudent->ShowInfo(); 
  10. cout << endl; 
  11. delete pPerson; 
  12. delete pTeacher; 
  13. delete pStudent; 

結果:

姓名:張三

年齡:22

姓名:李四

年齡:35

姓名:王五

年齡:18

這時,pTeacher和pStudent只輸出了姓名和年齡,并沒有輸出子類所具有的特性(職稱和學號)。這應該不是你期望的結果,你可能期望pTeacher和pStudent輸出老師和學生的完整信息,這時就需要用虛函數。

虛函數

我們把Person中的ShowInfo成員改成虛函數(在前面加上virtual),代碼如下:

【Demo3】

 

 
  1. class Person 
  2. public
  3. Person(const string& name, int age) : m_name(name), m_age(age) 
  4.  
  5. virtual void ShowInfo() 
  6. cout << "姓名:" << m_name << endl; 
  7. cout << "年齡:" << m_age << endl; 
  8.  
  9. protected
  10. string m_name; //姓名 
  11. int m_age; //年齡 
  12. }; 

在執行上面【Demo2】中的測試代碼,得到我們想到的結果:

姓名:張三

年齡:22

姓名:李四

年齡:35

職稱:副教授

姓名:王五

年齡:18

學號:20151653

虛函數用法要點:

虛函數的聲明方式:virtual RETURN_TYPE functionName(ARGS 參數列表);

虛函數作用:現實C++中的多態,進行動態綁定(父類指針可指向子類的對象),直到運行時才知道要調用哪個版本(哪個類定義)的函數;

我們必要對虛函數進行定義;

一旦父類的成員函數聲明virtual,其子類的函數不管有沒有聲明為virtual,都是虛函數;

如果虛函數使用默認實參,父類和子類定義的默認實參最好一致。

【Demo4】:針對第4點說明:

 

 
  1. class Person 
  2. public
  3. Person(const string& name, int age) : m_name(name), m_age(age) 
  4.  
  5. virtual void ShowInfo() 
  6. cout << "姓名:" << m_name << endl; 
  7. cout << "年齡:" << m_age << endl; 
  8.  
  9. string GetName(); //正確,普通函數如果不被使用,可以只有聲明沒有定義 
  10. virtual int GetAge(); //錯誤,虛函數必須要有定義,即使是一個空實現,因為編譯器無法確定會使用哪個函數 
  11.  
  12.  
  13. protected
  14. string m_name; //姓名 
  15. int m_age; //年齡 
  16. }; 

【Demo5】:針對第5點進行說明:

設計我們的類如下定義。

 

 
  1. class Person 
  2. public
  3. virtual void SetAge(int age = 0) 
  4. m_age = age; 
  5. //... 省略 
  6. }; 
  7.  
  8.  
  9. class Teacher : public Person 
  10. public
  11. virtual void SetAge(int age = 1) 
  12. m_age = age; 
  13.  
  14. //... 省略 
  15. }; 
  16.  
  17. class Student : public Person 
  18. public
  19. virtual void SetAge(int age = 2) 
  20. m_age = age; 
  21.  
  22. //... 省略 
  23. }; 

測試1:

 

 
  1. void test() 
  2. Person* pPerson = new Person("張三", 22); 
  3. Teacher* pTeacher = new Teacher("李四", 35, "副教授"); 
  4. Student* pStudent = new Student("王五", 18, 20151653); 
  5. pPerson->SetAge(); 
  6. pTeacher->SetAge(); 
  7. pStudent->SetAge(); 
  8.  
  9. pPerson->ShowInfo(); 
  10. cout << endl; 
  11. pTeacher->ShowInfo(); 
  12. cout << endl; 
  13. pStudent->ShowInfo(); 
  14. cout << endl; 
  15. delete pPerson; 
  16. delete pTeacher; 
  17. delete pStudent; 

結果:

姓名:張三

年齡:0

姓名:李四

年齡:1

職稱:副教授

姓名:王五

年齡:2

學號:20151653

測試2:

 

 
  1. void test() 
  2. Person* pPerson = new Person("張三", 22); 
  3. Person* pTeacher = new Teacher("李四", 35, "副教授"); 
  4. Person* pStudent = new Student("王五", 18, 20151653); 
  5. pPerson->SetAge(); 
  6. pTeacher->SetAge(); 
  7. pStudent->SetAge(); 
  8.  
  9. pPerson->ShowInfo(); 
  10. cout << endl; 
  11. pTeacher->ShowInfo(); 
  12. cout << endl; 
  13. pStudent->ShowInfo(); 
  14. cout << endl; 
  15. delete pPerson; 
  16. delete pTeacher; 
  17. delete pStudent; 

結果:

姓名:張三

年齡:0

姓名:李四

年齡:0

職稱:副教授

姓名:王五

年齡:0

學號:20151653

純虛函數

在上面的例子中,我們假設所有的人都要工作,但不同的人工作的方式不同。于是我們就要強制要求繼承自Person的子類都要有工作的方法,這就需要純虛函數。定義如下:

【Demo6】

 

 
  1. class Person 
  2. public
  3. //... 省略 
  4. virtual void DoWork() = 0; 
  5. //... 省略 
  6. }; 

但此時我們編譯

 

 
  1. Person* pPerson = new Person("張三", 22); 

這句話時會報錯:error C2259: ‘Person' : cannot instantiate abstract class

這是因為我們并沒有為Person實現DoWork方法,而包含純虛函數的類是一個抽象的類,抽象類不能被實例化。

于是我們在子類中對它實現如下:

【Demo7】

 

 
  1. class Teacher : public Person 
  2. public
  3. //... 省略 
  4. virtual void DoWork() 
  5. cout << "教書..." << endl; 
  6. //... 省略 
  7. }; 
  8.  
  9. class Student : public Person 
  10. public
  11. //... 省略 
  12. virtual void DoWork() 
  13. cout << "學習..." << endl; 
  14. //... 省略 
  15. }; 

沒用DoWork方法:

 

 
  1. void test() 
  2. Person* pTeacher = new Teacher("李四", 35, "副教授"); 
  3. Person* pStudent = new Student("王五", 18, 20151653); 
  4.  
  5. pTeacher->DoWork(); 
  6. cout << endl; 
  7. pStudent->DoWork(); 
  8. cout << endl; 
  9.  
  10. delete pTeacher; 
  11. delete pStudent; 

結果:

教書…

學習…

純虛函數用法要點:

純虛函數的聲明方式:virtual RETURN_TYPE functionName(ARGS 參數列表) = 0;

含有純虛函數的類是一個抽象的類,抽象類不能被實例化。

包含純虛函數的抽象類常用來當作對外的接口,說明這個類有什么功能,而沒有具體的實現,基體的實現交由子類完成。

通過以上對普通成員函數、虛函數以及純虛函數的介紹,希望可以對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
精品麻豆一区二区三区| 天天艹天天操| 久蕉依人在线视频| 免费三级毛片| 久久精品免视着国产成人| 青青草中文字幕| 开心丁香婷婷深爱五月| 国内精品不卡| 国产天堂在线| 91激情在线| 久久久久久91精品色婷婷| 国产免费福利| 国产99在线|亚洲| 国产高清大尺度一区二区不卡| 国产三区在线观看| av二区三区| 老司机在线视频二区| 国产乱妇乱子| 在线色视频观看| 黄色一级视频网站| 精品麻豆国产| 国产美女性感在线观看懂色av| 2018av男人天堂| 美女网站在线观看| 国产色婷婷在线| 免费在线黄色网址| 96久久久久久| 国产免费a∨片在线观看不卡| 国产素人视频在线观看| 在线观看免费观看在线91| 国产在线小视频| 亚洲精品影院在线| 国产xxxx做受性欧美88| 丁香视频免费观看| 在线免费观看污| 国产视频一二| 国产在线高潮| 欧美日韩视频精品二区| 国产成人夜间影院在线观看| 黄色国产网站在线观看| www.夜夜操.com| 四虎精品视频| 日本精品一区二区三区在线播放| 国产精品jvid在线观看| 中文字幕亚洲精品视频| 国产原创av在线| 免费a在线观看| 久久久久久久久免费视频| 亚洲xxxxxx| www.eeuss影院| 麻豆国产视频| 国产在线观看a| 激情视频国产| 国产一二三视频| 国产二区视频在线观看| 91欧美在线视频| av中文资源在线| av在线资源网| 日本国产在线| 玖玖在线视频| 国产免费黄视频在线观看| 最新超碰在线| 精品女厕厕露p撒尿| 在线视频三级| 国产在线一二| 国产经典三级在线| 亚洲综合激情六月婷婷在线观看 | 激情综合丁香| 九九热视频精品在线观看| 国产一区精品| 天堂网中文在线| 中文字幕av中文字幕| 99高清免费国产自产拍| 麻豆精品不卡国产免费看| 最新超碰在线| 亚洲www色| 国产精品伦理一区二区三区 | 国产亚洲精品久久久网站好莱| 国产视频2区| www狠狠操| 91免费日韩| 国产一区二区三区四区尤物| av男人的天堂网| 国产精品臀控福利在线观看| av片在线观看| 中文日本在线观看| 国产精美视频| 中文字幕在线第一页| 日本一级理论片在线大全| 国产对白国语对白| 国产一级影片| 天天操夜夜摸| 国产精品一区二三区| jlzzjlzz欧美大全| a√在线视频| 91中文字幕| 国产污视频在线| 国产网站av| 最新天堂资源在线| 国产九九在线| 国产小视频免费在线观看| 成人无遮挡免费网站视频在线观看| 欧美日韩在线视频免费观看| 亚洲视频在线网| 亚洲永久免费网站| 亚洲久草视频| 激情视频国产| 高清av中文在线字幕观看1| 日本高清中文字幕在线| 在线观看精品一区二区三区| 中文字幕av网| www.eeuss影院| 成年人在线观看| 国产视频青青| 伊人222成人综合网| 亚洲天堂影院在线观看| sese一区| 国产日产一区二区三区| 精品成人免费自拍视频| 欧美日韩国产亚洲沙发| 国产精品臀控福利在线观看| 国产黄在线看| 欧美啪啪精品| 国产乱精品一区二区三区| 中文字幕专区| 亚洲成a人v欧美综合天堂麻豆| 就爱干草视频| 精品伦理一区二区| 黄色av电影在线播放| 国产精品不卡一区二区三区在线观看| 中文字幕av在线| 国产美女高潮| 四虎成人欧美精品在永久在线| 九七电影韩国女主播在线观看| 国产三级视频| 蜜桃视频中文字幕| 91九色在线看| 天天操夜夜摸| 日本在线观看网站| 中文字幕欧美日韩在线不卡| 亚洲一区免费在线| 国产视频福利| 国产精品自拍在线观看| 亚洲日本一区二区三区在线观看| 五月天丁香在线| 狠狠插狠狠操| eeuss影院在线观看| 国产成免费视频| 天堂在线亚洲| 国产麻豆精品一区二区三区v视界| 亚洲人在线播放| 中文字幕4区| 777电影在线观看| 国产羞羞视频在线观看| 狠狠干天天爱| 久久国产综合视频| www.综合网.com| 尤物在线精品视频| 精品亚洲成a人片在线观看| 午夜视频免费在线观看| wwww亚洲| 久热国产视频| 福利在线国产| 中文字幕在线视频观看| 国产网友自拍电影在线| 国产小视频在线观看| 99热在线免费观看| 国产视频二区| 国产激情在线观看| 国产私人影院| 精品三级久久久久久久电影聊斋 | 中文字幕色视频| 天天av综合网| 国产成人午夜| www.狠狠| 中文字幕第一页在线| 国产成人福利| а√天堂8资源在线官网| 麻豆国产在线视频| 国产一二三视频| 国产极品视频| 亚洲精品一区中文字幕电影| heisi视频网在线观看| 欧美高清视频| 国产激情三区| www.国产精品.com| 国产精品作爱| 亚洲精品视频在线免费| 激情在线视频播放| 2019中文字幕视频| 久久91精品视频| 精品网站www| 中文字幕在线资源| 在线观看的网站你懂的| 福利视频在线看| 中文天堂av| 中文字幕色视频| 天堂网中文在线| 国产高清在线看| 国产综合视频一区二区三区免费|