亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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;

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
免费99精品国产自在在线| 成人av资源在线播放| 国产精品九九久久久久久久| 亚洲a区在线视频| 欧美人与性动交| 日韩欧美a级成人黄色| 精品久久久精品| 91久久国产精品91久久性色| 亚洲资源在线看| 久久久久久久久综合| www.欧美精品一二三区| 欧美激情xxxxx| 久久中文字幕视频| 久久久欧美一区二区| 国产精品亚洲第一区| 国产91在线播放九色快色| 精品美女国产在线| 中国china体内裑精亚洲片| 国产精品久久久久国产a级| 国产成人97精品免费看片| 欧美老女人xx| 国产精品女视频| 成人97在线观看视频| 欧洲亚洲免费视频| 欧美黑人视频一区| 成人激情视频在线| 日韩av毛片网| 国产69精品久久久久9999| 欧美国产日韩二区| 国产精品jvid在线观看蜜臀| 久久综合久久88| 日韩黄在线观看| 欧美日韩国产精品一区二区三区四区| 亚洲精品av在线播放| 久久久久久久香蕉网| 欧美中文在线视频| 欧美大全免费观看电视剧大泉洋| 久久久噜久噜久久综合| 国产成人一区二区三区| 亚洲欧美日韩精品久久| 亚洲精品成a人在线观看| 欧美性高跟鞋xxxxhd| 亚洲无限av看| 91免费综合在线| 亚洲精品网站在线播放gif| 精品美女国产在线| 亚洲精品动漫100p| 久久久黄色av| 亚洲男人天堂2023| 亚洲理论在线a中文字幕| 国产视频在线观看一区二区| 高清一区二区三区四区五区| 亚洲成av人乱码色午夜| 色哟哟亚洲精品一区二区| 亚洲а∨天堂久久精品喷水| 欧美国产在线电影| 国产情人节一区| 性欧美xxxx视频在线观看| 日韩精品免费视频| 精品日本美女福利在线观看| 日韩免费观看网站| 国外成人在线直播| 日韩精品极品在线观看| 国产精品极品美女粉嫩高清在线| 色无极亚洲影院| 亚洲天堂男人天堂| 国产精品aaa| 91久久综合亚洲鲁鲁五月天| 日韩综合视频在线观看| 精品免费在线观看| 久久综合久久美利坚合众国| 欧美在线视频免费播放| 国产精品午夜国产小视频| 美女精品久久久| 91在线视频成人| 精品国产一区二区三区久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美成人免费一级人片100| 91久久精品日日躁夜夜躁国产| 欧美色道久久88综合亚洲精品| 91亚洲国产成人久久精品网站| 亚洲综合大片69999| 亚洲图片欧洲图片av| 久久久97精品| 亚洲精品国产品国语在线| 色悠久久久久综合先锋影音下载| 精品在线观看国产| 国产精彩精品视频| 亚洲美女性生活视频| 欧美激情va永久在线播放| 亚洲区一区二区| 日韩精品在线第一页| 久久成人这里只有精品| 国产日产欧美精品| 久久精品99久久久香蕉| 一区二区三区动漫| 97香蕉久久超级碰碰高清版| 欧美精品一区二区三区国产精品| 国产日韩换脸av一区在线观看| 日韩av理论片| 久久视频在线免费观看| 亚洲第一中文字幕| 疯狂做受xxxx高潮欧美日本| 亚洲第一中文字幕在线观看| 亚洲精品电影在线观看| 超碰精品一区二区三区乱码| 51精品国产黑色丝袜高跟鞋| 亚洲最大激情中文字幕| 色狠狠久久aa北条麻妃| 91青草视频久久| 日韩av日韩在线观看| 欧美性猛交99久久久久99按摩| 国产成人精品视频在线观看| 欧美第一淫aaasss性| 欧美性猛交xxx| 日本一区二区在线免费播放| 久久久久99精品久久久久| 亚洲最大成人免费视频| 欧美激情一二区| 欧美性视频在线| 久久久女女女女999久久| 国产成人精品久久亚洲高清不卡| 日韩欧美中文字幕在线观看| 亚洲成色www8888| 91性高湖久久久久久久久_久久99| 日韩电影在线观看免费| 欧美与欧洲交xxxx免费观看| 亚洲精品自在久久| 日韩高清a**址| 国产人妖伪娘一区91| 成人有码视频在线播放| 日韩小视频在线观看| 热久久免费国产视频| 欧美中文字幕在线播放| 日韩精品欧美国产精品忘忧草| 日韩电影免费观看中文字幕| 不卡av日日日| 亚洲精品一区av在线播放| 欧美激情一区二区三区成人| 国产a级全部精品| 国产69久久精品成人看| 国产精品欧美激情在线播放| 久久久av免费| 亚洲爱爱爱爱爱| 91精品国产网站| 国产欧美日韩免费看aⅴ视频| 日韩在线免费高清视频| 最近2019中文字幕第三页视频| 2018中文字幕一区二区三区| 久久久久久久久久国产| 45www国产精品网站| 欧美激情综合色综合啪啪五月| 亚洲欧美第一页| 国产亚洲人成网站在线观看| 欧美激情欧美激情在线五月| 精品中文字幕在线观看| 成人精品久久一区二区三区| 69久久夜色精品国产7777| 欧美性生交xxxxxdddd| 亚洲加勒比久久88色综合| 久久亚洲欧美日韩精品专区| 久久99热这里只有精品国产| 欧美成人久久久| 久久精品国产视频|