精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ Virtual詳解

開發 后端
C++通過虛函數實現多態."無論發送消息的對象屬于什么類,它們均發送具有同一形式的消息,對消息的處理方式可能隨接手消息的對象而變"的處理方式被稱為多態性。而虛函數是通過Virtual關鍵字來限定的。下面讓我們一起來看。

Virtual是C++ OO(面向對象機制)機制中很重要的一個關鍵字。虛函數就是因為成員函數加了關鍵字virtual,可見它的重要性。

只要是學過C++的人都知道在類Base中加了Virtual關鍵字的函數就是虛擬函數(例如函數print),于是在Base的派生類Derived中就可以通過重寫虛擬函數來實現對基類虛擬函數的覆蓋。當基類Base的指針point指向派生類Derived的對象時,對point的print函數的調用實際上是調用了Derived的print函數而不是Base的print函數。這是面向對象中的多態性的體現。(關于虛擬機制是如何實現的,參見Inside the C++ Object Model ,Addison Wesley 1996)

  1. //---------------------------------------------------------  
  2. class Base  
  3. {  
  4. public:Base(){}  
  5. public:  
  6. virtual void print(){cout<<"Base";}  
  7. };  
  8. class Derived:public Base  
  9. {  
  10. public:Derived(){}  
  11. public:  
  12. void print(){cout<<"Derived";}  
  13. };  
  14. int main()  
  15. {  
  16. Base *point=new Derived();  
  17. point->print();  
  18. }   
  19. //---------------------------------------------------------  
  20. Output:  
  21. Derived  

這也許會使人聯想到函數的重載,但稍加對比就會發現兩者是完全不同的:

(1) 重載的幾個函數必須在同一個類中; 

覆蓋的函數必須在有繼承關系的不同的類中

(2) 覆蓋的幾個函數必須函數名、參數、返回值都相同;

重載的函數必須函數名相同,參數不同。參數不同的目的就是為了在函數調用的時候編譯器能夠通過參數來判斷程序是在調用的哪個函數。這也就很自然地解釋了為什么函數不能通過返回值不同來重載,因為程序在調用函數時很有可能不關心返回值,編譯器就無法從代碼中看出程序在調用的是哪個函數了。

(3) 覆蓋的函數前必須加關鍵字Virtual;

重載和Virtual沒有任何瓜葛,加不加都不影響重載的運作。

關于C++的隱藏規則(引用自《高質量C++/C 編程指南》林銳 2001):

(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual

關鍵字,基類的函數將被隱藏(注意別與重載混淆)。

(2)如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual
關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。

這里,林銳博士好像犯了個錯誤。C++并沒有隱藏規則,林銳博士所總結的隱藏規則是他錯誤地理解C++多態性所致。下面請看林銳博士給出的隱藏規則的例證:

  1. #include <iostream.h>  
  2. class Base  
  3. {  
  4. public:  
  5. virtual void f(float x){ cout << "Base::f(float) " << x << endl; }  
  6. void g(float x){ cout << "Base::g(float) " << x << endl; }  
  7. void h(float x){ cout << "Base::h(float) " << x << endl; }  
  8. };  
  9. class Derived : public Base  
  10. {  
  11. public:  
  12. virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }  
  13. void g(int x){ cout << "Derived::g(int) " << x << endl; }  
  14. void h(float x){ cout << "Derived::h(float) " << x << endl; }  
  15. };  
  16. void main(void)  
  17. {  
  18. Derived d;  
  19. Base *pb = &d;  
  20. Derived *pd = &d;  
  21. // Good : behavior depends solely on type of the object  
  22. pb->f(3.14f); // Derived::f(float) 3.14  
  23. pd->f(3.14f); // Derived::f(float) 3.14  
  24. // Bad : behavior depends on type of the pointer  
  25. pb->g(3.14f); // Base::g(float) 3.14  
  26. pd->g(3.14f); // Derived::g(int) 3 (surprise!)  
  27. // Bad : behavior depends on type of the pointer  
  28. pb->h(3.14f); // Base::h(float) 3.14 (surprise!)  
  29. pd->h(3.14f); // Derived::h(float) 3.14  

林銳博士認為bp 和dp 指向同一地址,按理說運行結果應該是相同的,而事實上運行結果不同,所以他把原因歸結為C++的隱藏規則,其實這一觀點是錯的。決定bp和dp調用函數運行結果的不是他們指向的地址,而是他們的指針類型。“只有在通過基類指針或引用間接指向派生類子類型時多態性才會起作用”(C++ Primer 3rd Edition)。pb是基類指針,pd是派生類指針,pd的所有函數調用都只是調用自己的函數,和多態性無關,所以pd的所有函數調用的結果都輸出Derived::是完全正常的;pb的函數調用如果有virtual則根據多態性調用派生類的,如果沒有virtual則是正常的靜態函數調用,還是調用基類的,所以有virtual的f函數調用輸出Derived::,其它兩個沒有virtual則還是輸出Base::很正常啊,nothing surprise! 

所以并沒有所謂的隱藏規則,雖然《高質量C++/C 編程指南》是本很不錯的書,可大家不要迷信哦。記住“只有在通過基類指針或引用間接指向派生類子類型時多態性才會起作用”。

純虛函數:

C++語言為我們提供了一種語法結構,通過它可以指明,一個虛擬函數只是提供了一個可被子類型改寫的接口。但是,它本身并不能通過虛擬機制被調用。這就是純虛擬函數(pure virtual function)。 純虛擬函數的聲明如下所示:

  1. class Query {  
  2. public:  
  3. // 聲明純虛擬函數  
  4. virtual ostream& print( ostream&=cout ) const = 0;  
  5. // ...  
  6. }; 

這里函數聲明后面緊跟賦值0。

包含(或繼承)一個或多個純虛擬函數的類被編譯器識別為抽象基類。試圖創建一個抽象基類的獨立類對象會導致編譯時刻錯誤。(類似地通過虛擬機制調用純虛擬函數也是錯誤的例如)

  1. // Query 聲明了純虛擬函數  
  2. // 所以, 程序員不能創建獨立的 Query 類對象  
  3. // ok: NameQuery 中的 Query 子對象  
  4. Query *pq = new NameQuery( "Nostromo" );  
  5. // 錯誤: new 表達式分配 Query 對象  
  6. Query *pq2 = new Query; 

抽象基類只能作為子對象出現在后續的派生類中。

如果只知道virtual加在函數前,那對virtual只了解了一半,virtual還有一個重要用法是virtual public,就是虛擬繼承。虛擬繼承在C++ Primer中有詳細的描述,下面稍作修改的闡釋一下:

在缺省情況下C++中的繼承是“按值組合”的一種特殊情況。當我們寫

  1. class Bear : public ZooAnimal { ... }; 

每個Bear 類對象都含有其ZooAnimal 基類子對象的所有非靜態數據成員以及在Bear中聲明的非靜態數據成員類似地當派生類自己也作為一個基類對象時如:

  1. class PolarBear : public Bear { ... }; 

則PolarBear 類對象含有在PolarBear 中聲明的所有非靜態數據成員以及其Bear 子對象的所有非靜態數據成員和ZooAnimal 子對象的所有非靜態數據成員。在單繼承下這種由繼承支持的特殊形式的按值組合提供了最有效的最緊湊的對象表示。在多繼承下當一個基類在派生層次中出現多次時就會有問題最主要的實際例子是iostream 類層次結構。ostream 和istream 類都從抽象ios 基類派生而來,而iostream 類又是從ostream 和istream 派生

  1. class iostream :public istream, public ostream { ... }; 

缺省情況下,每個iostream 類對象含有兩個ios 子對象:在istream 子對象中的實例以及在ostream 子對象中的實例。這為什么不好?從效率上而言,存儲ios 子對象的兩個復本,浪費了存儲區,因為iostream 只需要一個實例。而且,ios 構造函數被調用了兩次每個子對象一次。更嚴重的問題是由于兩個實例引起的二義性。例如,任何未限定修飾地訪問ios 的成員都將導致編譯時刻錯誤:到底訪問哪個實例?如果ostream 和istream 對其ios 子對象的初始化稍稍不同,會怎樣呢?怎樣通過iostream 類保證這一對ios 值的一致性?在缺省的按值組合機制下,真的沒有好辦法可以保證這一點。

C++語言的解決方案是,提供另一種可替代按“引用組合”的繼承機制虛擬繼承(virtual inheritance )在虛擬繼承下只有一個共享的基類子對象被繼承而無論該基類在派生層次
中出現多少次共享的基類子對象被稱為虛擬基類。

通過用關鍵字virtual 修政一個基類的聲明可以將它指定為被虛擬派生。例如,下列聲明使得ZooAnimal 成為Bear 和Raccoon 的虛擬基類:

  1. // 關鍵字 public 和 virtual的順序不重要  
  2. class Bear : public virtual ZooAnimal { ... };  
  3. class Raccoon : virtual public ZooAnimal { ... }; 

虛擬派生不是基類本身的一個顯式特性,而是它與派生類的關系如前面所說明的,虛擬繼承提供了“按引用組合”。也就是說,對于子對象及其非靜態成員的訪問是間接進行的。這使得在多繼承情況下,把多個虛擬基類子對象組合成派生類中的一個共享實例,從而提供了必要的靈活性。同時,即使一個基類是虛擬的,我們仍然可以通過該基類類型的指針或引用,來操縱派生類的對象。

沒有虛函數的C++不能面向對象。從商業的角度看,面向對象能使系統具有可擴展性和可適應性,但只有C++類的語法而沒有面向對象的話,就不會減少維護成本,而實際上會增加成本。所以沒有虛函數是萬萬不能的,而關鍵字virtual則是關鍵。

【編輯推薦】

  1. C++多態技術的實現和反思
  2. 實現C++虛函數時相關注意事宜
  3. 如何實現C++虛函數表中的虛函數
  4. C++虛函數示例解讀


 

責任編輯:于鐵 來源: CSDN
相關推薦

2021-12-21 15:31:10

C++語言指針

2010-02-02 11:16:28

C++異常

2023-11-09 23:56:21

2024-01-22 10:49:55

C++for循環

2010-01-18 16:17:53

C++代碼

2011-03-30 17:20:18

C++引用

2024-01-18 10:27:30

C++引用函數

2010-02-01 16:13:15

C++繼承

2024-03-14 11:54:37

C++數據類型

2010-02-02 15:59:32

C++賦值函數

2011-07-15 01:10:13

C++內存分配

2011-08-04 13:38:01

Objective-C C++

2010-02-02 10:33:22

C++引用

2010-02-02 17:08:22

2010-02-01 14:53:42

C++屬性

2010-02-06 10:50:10

C++統計對象個數

2010-01-15 14:10:42

C++單元測試

2009-10-09 14:24:27

2011-07-15 01:38:56

C++this指針

2011-07-01 10:16:08

C++內存管理
點贊
收藏

51CTO技術棧公眾號

欧美高清视频一区二区三区| 玖玖爱视频在线| 日韩三级电影网| 日韩影院精彩在线| 精品国产欧美成人夜夜嗨| 国产精品欧美性爱| 3d欧美精品动漫xxxx无尽| 亚洲欧美在线另类| 国内精品久久久久久久果冻传媒| 中文字幕视频网| 久久久久国产| 国产视频精品va久久久久久| 日韩爱爱小视频| heyzo在线播放| 国产精品日产欧美久久久久| 国产精品永久入口久久久| 青青艹在线观看| 亚洲精品1区| www国产亚洲精品久久网站| 午夜男人的天堂| 粉嫩av一区二区三区四区五区| 一区二区三区四区不卡在线| 日本一区免费观看| 亚洲女人18毛片水真多| 麻豆精品视频在线观看视频| 亚州国产精品久久久| 任我爽在线视频| 亚洲欧洲美洲国产香蕉| 欧美哺乳videos| 在线黄色免费观看| 欧美黑人巨大xxxxx| 亚洲va中文字幕| av动漫免费观看| 国产三级电影在线| heyzo一本久久综合| 亚洲一区二区免费在线| 一级片视频免费| 久久视频一区| 91sa在线看| 日韩免费一二三区| 午夜精品999| 日韩视频免费在线观看| 亚洲欧美va天堂人熟伦| 无码日韩精品一区二区免费| 精品国产免费人成电影在线观看四季 | 99九九99九九九99九他书对| 精品无人乱码一区二区三区 | 国产精品久久久久精| 日欧美一区二区| 国产精品com| 欧产日产国产69| 老鸭窝亚洲一区二区三区| 456亚洲影院| av图片在线观看| 性xx色xx综合久久久xx| 日本三级久久久| aaa在线视频| 免费人成在线不卡| 国产精品视频自拍| 国产又粗又猛又爽又黄视频| 黑人巨大精品欧美黑白配亚洲| 国产精品99久久久久久久久| 懂色av蜜臀av粉嫩av喷吹| 日本强好片久久久久久aaa| 日韩av免费在线| 波多野结衣一区二区在线| 日本视频一区二区三区| 国产精品一区二区久久久| 伊人色综合久久久| 韩国毛片一区二区三区| 亚洲最大av网| 人妻少妇精品无码专区| 久久免费的精品国产v∧| 欧美人与性禽动交精品| 午夜激情视频在线| 亚洲精品欧美综合四区| 青青青青草视频| 激情都市亚洲| 91精品蜜臀在线一区尤物| 国产精久久久久| 色橹橹欧美在线观看视频高清 | 日本精品在线| 夜夜精品视频一区二区| 丝袜老师办公室里做好紧好爽| 欧美精选视频一区二区| 在线播放中文一区| 成人做爰www看视频软件| 四虎5151久久欧美毛片| 中文字幕av一区| 久久网免费视频| 天堂蜜桃一区二区三区| 3d精品h动漫啪啪一区二区| 丁香六月天婷婷| 国产欧美日韩不卡| 97超碰在线视| 三级中文字幕在线观看| 欧美军同video69gay| 午夜剧场免费看| 欧美美女视频| 久久乐国产精品| 在线观看国产黄| 99久久综合色| 日本三日本三级少妇三级66| 伊人久久综合一区二区| 91精品蜜臀在线一区尤物| 亚洲永久精品ww.7491进入| 亚洲精品va| 国产精国产精品| 好吊视频一区二区三区| 国产精品久久一卡二卡| 欧美 日韩 国产 高清| 日本久久久久| 亚洲欧美在线第一页| 欧美三级在线免费观看| 日本欧美韩国一区三区| 精品国产乱码久久久久久蜜柚| 亚洲麻豆精品| 在线观看成人免费视频| 小毛片在线观看| 亚洲一区欧美| 国产欧美精品一区二区| 亚洲欧洲成人在线| 亚洲影院免费观看| 高清av免费看| 欧美裸体在线版观看完整版| 97超视频免费观看| 东京干手机福利视频| 亚洲免费av在线| 亚洲另类第一页| 欧美日一区二区| 国产成人a亚洲精品| 神马久久久久久久久久| 亚洲男人天堂av网| 日韩av片专区| 日韩欧美1区| 国产91色在线| 免费在线一级视频| 欧美日韩中文字幕| 国产精品成人99一区无码 | 91专区在线观看| av一级亚洲| 欧美肥臀大乳一区二区免费视频| 国产又粗又猛又黄又爽无遮挡| 日本一区二区视频在线观看| 亚洲免费av一区二区三区| 中文精品一区二区| 热99精品只有里视频精品| 香蕉国产在线视频| 欧美午夜电影在线| 少妇特黄一区二区三区| 免费在线成人| 欧美日韩精品一区| 成人h在线观看| 中文字幕日韩av电影| 中文字幕一区二区三区波野结 | 伊人久久大香线蕉av一区| av成人在线观看| 日韩中文字幕精品| a在线观看视频| 亚洲午夜日本在线观看| av无码一区二区三区| 亚洲影音一区| 日韩高清在线播放| 日本国产一区| 欧美精品久久久久a| 污污视频在线观看网站| 欧美日韩一区二区三区在线免费观看| 爱爱免费小视频| 男男视频亚洲欧美| 亚洲第一精品区| 2020最新国产精品| 秋霞av国产精品一区| av福利在线播放| 欧美一区二区视频在线观看2020| 国产大片中文字幕在线观看| 91免费国产在线| 在线免费视频一区| 欧美日本免费| 免费久久99精品国产自| 成人国产精品| 欧美成人午夜剧场免费观看| 亚洲欧美日韩动漫| 欧美蜜桃一区二区三区| 久久精品国产av一区二区三区| 不卡电影一区二区三区| 五月婷婷深爱五月| 亚洲网色网站| 久久亚洲高清| 999精品嫩草久久久久久99| 国内精品一区二区三区四区| 经典三级在线| 欧美电影免费观看完整版| 99久久精品国产亚洲| 国产精品电影一区二区| 精品无码国产一区二区三区51安| 日韩高清一区在线| 成人免费在线视频播放| 精品freesex老太交| 1卡2卡3卡精品视频| 日韩一区二区三区在线免费观看| 久久影视免费观看| 国产区视频在线| 精品久久国产97色综合| 中国一级特黄视频| 亚洲第一精品在线| 日韩一卡二卡在线观看| 久久久久久久久久看片| 色哟哟免费视频| 男人的天堂亚洲一区| 免费看又黄又无码的网站| 国产精品久久久久久久久久10秀 | 9i精品一二三区| 欧美精品一区二区三区在线| 91国内精品视频| 在线观看国产91| 色屁屁影院www国产高清麻豆| 亚洲欧美日韩中文字幕一区二区三区| 日韩在线免费观看av| 懂色av一区二区三区免费看| 羞羞的视频在线| 青青草国产精品亚洲专区无| 日韩欧美一区二| 亚洲大片av| 成人免费看片视频在线观看| 国产精品97| 亚洲欧美影院| 精品久久美女| 欧美日韩一区二区三区在线观看免| 亚洲综合网站| 3d精品h动漫啪啪一区二区| 日本免费一区二区三区等视频| 人人爽久久涩噜噜噜网站| 蜜桃麻豆影像在线观看| 久久久久久久久综合| 性xxxxfjsxxxxx欧美| 超碰精品一区二区三区乱码| 日本在线www| 深夜精品寂寞黄网站在线观看| 国产中文在线视频| 国产亚洲欧美一区| 国产一区二区三区福利| 亚洲欧美日韩在线一区| 青青青免费视频在线2| 亚洲美女又黄又爽在线观看| 色鬼7777久久| 亚洲人成网站免费播放| 免费理论片在线观看播放老| 亚洲欧美日韩一区二区在线 | 黄色三级视频片| 三级影片在线观看欧美日韩一区二区| 18禁男女爽爽爽午夜网站免费 | 中文字幕亚洲影院| 久久国产精品第一页| 久久久久国产一区| 久久精品国内一区二区三区| av噜噜在线观看| 国产精品1024| 日本不卡视频一区| 97成人超碰视| 90岁老太婆乱淫| 国产精品久久久久影院亚瑟| 日韩亚洲欧美中文字幕| 亚洲欧美电影院| 久久丫精品久久丫| 欧美日韩亚洲视频一区| 中文字幕a级片| 欧美一区二区美女| 免费的黄色av| 亚洲片av在线| 99re在线视频| 欧美疯狂xxxx大交乱88av| 99riav视频在线观看| 日韩免费观看高清| 日韩三级成人| 国产伦精品一区二区三区照片91 | 在线免费观看亚洲| 99久久伊人精品影院| 粉嫩的18在线观看极品精品| 久久波多野结衣| 色乱码一区二区三区网站| 永久免费看av| 久久黄色网页| 69久久精品无码一区二区| 91小视频在线| 性欧美疯狂猛交69hd| 精品久久久久人成| 91欧美日韩麻豆精品| 亚洲精品一区二区三区在线观看| 久久久久久青草| 欧美日韩成人精品| 澳门av一区二区三区| 91丝袜脚交足在线播放| 国产日产精品一区二区三区四区的观看方式 | 亚洲成a人v欧美综合天堂麻豆| 欧美激情2020午夜免费观看| 欧美国产大片| 国产精品久久久久久久久久久久冷 | 欧美不卡视频在线观看| 欧美日韩一区成人| 欧美性猛交 xxxx| 少妇精69xxtheporn| 日韩深夜视频| 国产精品v欧美精品∨日韩| 欧美精品一区二区三区精品| 日本欧美黄色片| 国产一区二区三区久久悠悠色av| 国产又爽又黄无码无遮挡在线观看| 亚洲欧美一区二区三区久本道91 | а√天堂8资源中文在线| 国产欧美日韩丝袜精品一区| 午夜精品福利影院| 国产在线视频在线| 毛片av一区二区三区| 精品无码国产一区二区三区51安| 亚洲色图视频网站| 国产精品一区无码| 亚洲精品国产精品自产a区红杏吧| 国产在线观看a视频| 国产精品老女人视频| 麻豆成人入口| 日本黄大片在线观看| 国产自产视频一区二区三区| 亚洲精品视频网址| 大伊人狠狠躁夜夜躁av一区| 人妻91麻豆一区二区三区| 欧美xxxx做受欧美.88| 97久久精品一区二区三区的观看方式 | 久久免费大视频| 日本三级免费网站| caoporm超碰国产精品| 国产无精乱码一区二区三区| 日韩一区二区三区av| 菠萝蜜视频国产在线播放| 国产精品专区一| 欧美色图激情小说| 亚洲国产精品毛片av不卡在线| 99久久精品免费精品国产| 69精品久久久| 亚洲国产高清自拍| 激情国产在线| 国产日韩久久| 亚洲毛片播放| 最近日本中文字幕| 欧美丝袜美女中出在线| 亚洲av成人无码网天堂| 欧美中文在线免费| 最近国产精品视频| 日本xxxxxxx免费视频| 国产亚洲综合在线| 69视频免费看| 日韩亚洲精品电影| 国产精品视频首页| 欧美乱做爰xxxⅹ久久久| 国产东北露脸精品视频| 久热精品在线观看| 亚洲国产精品视频在线观看| 综合另类专区| 亚洲不卡一卡2卡三卡4卡5卡精品| 国产免费成人| 国产欧美一区二区三区在线观看视频| 欧美唯美清纯偷拍| 久久黄色美女电影| 国产精品加勒比| 蜜桃视频一区| 国产又粗又硬又长又爽| 欧美成人一区二区三区片免费 | 国产精品jizz在线观看麻豆| 欧美日韩国产高清电影| 午夜一区二区视频| 一区二区三区中文字幕电影| 好吊视频一区二区三区| 人体精品一二三区| 欧美成免费一区二区视频| 日本人妻一区二区三区| 日韩欧美国产激情| 黄色av免费在线| 国产亚洲情侣一区二区无| 日韩成人伦理电影在线观看| 在线观看美女av| 精品在线小视频| 二区三区精品| 少妇高潮毛片色欲ava片| 日本一区二区三区久久久久久久久不 | 黄色国产在线播放| 日韩免费成人网| 国产精品极品美女在线观看| 中国一级黄色录像| 99久久精品一区| 911美女片黄在线观看游戏| 国内精品视频一区| 国产精品伦理久久久久久| 免费成人蒂法网站| 欧美日韩大陆一区二区| gogo高清午夜人体在线| 亚洲高清123| aaa国产一区| 性少妇videosexfreexxx片| 日本乱人伦a精品| 亚洲高清在线| 国产一区二区三区视频播放|