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

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

C++中虛函數與純虛函數的用法

2020-01-26 15:24:09
字體:
來源:轉載
供稿:網友

本文較為深入的分析了C++中虛函數與純虛函數的用法,對于學習和掌握面向對象程序設計來說是至關重要的。具體內容如下:

首先,面向對象程序設計(object-oriented programming)的核心思想是數據抽象、繼承、動態綁定。通過數據抽象,可以使類的接口與實現分離使用繼承,可以更容易地定義與其他類相似但不完全相同的新類,使用動態綁定,可以在一定程度上忽略相似類的區別,而以統一的方式使用它們的對象。

虛函數的作用是實現多態性(Polymorphism),多態性是將接口與實現進行分離,采用共同的方法,但因個體差異而采用不同的策略。純虛函數則是一種特殊的虛函數。虛函數聯系到多態,多態聯系到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什么都沒得談。

一、虛函數

1 . 定義

在C++中,基類必須將它的兩種成員函數區分開來:一種是基類希望其派生類進行覆蓋的函數;另一種是基類希望派生類直接繼承而不要改變的函數。對于前者,基類通過在函數之前加上virtual關鍵字將其定義為虛函數(virtual)。

class Base{ // 基類 public:   virtual int func(int n) const; };  class Derive_Class : public Base{ public:   int func(int n) const; // 默認也為虛函數 }; 

當我們在派生類中覆蓋某個函數時,可以在函數前加virtual關鍵字。然而這不是必須的,因為一旦某個函數被聲明成虛函數,則所有派生類中它都是虛函數。任何構造函數之外的非靜態函數都可以是虛函數。派生類經常(但不總是)覆蓋它繼承的虛函數,如果派生類沒有覆蓋其基類中某個虛函數,則該虛函數的行為類似于其他的普通成員,派生類會直接繼承其在基類中的版本。

2 . 動態綁定

當我們使用基類的引用(或指針)調用一個虛函數時將發生動態綁定(dynamic binding)。因為我們直到運行時才能知道到底調用了哪個版本的虛函數,可能是基類中的版本也可能是派生類中的版本,判斷的依據是引用(或指針)所綁定的對象的真實類型。與非虛函數在編譯時綁定不同,虛函數是在運行時選擇函數的版本,所以動態綁定也叫運行時綁定(run-time binding)。

3 . 靜態類型與動態類型

靜態類型指的是變量聲明時的類型或表達式生成的類型,它在編譯時總是已知的;動態類型指的是變量或表達式表示的內存中的對象的類型,它直到運行時才可知。當且僅當通過基類的指針或引用調用虛函數時,才會在運行時解析該調用,也只有在這種情況下對象的動態類型才有可能與靜態類型不同。如果表達式既不是引用也不是指針,則它的動態類型永遠與靜態類型一致。

4 . final和override

派生類中如果定義了一個函數與基類中虛函數同名但形參列表不同,編譯器會認為這是派生類新定義的函數。如果我們的意圖本是覆蓋虛函數,則這種錯誤很難發現。通過在派生類中的虛函數最后加override關鍵字使得意圖更加清晰。如果我們使用override標記了某個函數,但該函數并沒有覆蓋已存在的虛函數,編譯器將報錯。

class Base{ // 基類 public:   virtual int func(int a, int b) const; };  class Derive_Class : public Base{ public:   int func(int a) const override; // 報錯,沒有覆蓋虛函數 }; 

如果我們定義一個類,并不希望它被繼承?;蛘呦M硞€函數不被覆蓋,則可以把類或者函數指定為final,則之后任何嘗試繼承該類或覆蓋該函數的操作將引發錯誤。

class Base final { /*  */ };   // 基類不能被繼承 class Derive_Class : public Base { /* */ };   // 報錯  void func(int) const final;  // 不允許后續的其他類覆蓋func(int)

5 . 回避虛函數的機制

在某些情況下,我們希望對虛函數的調用不要進行動態綁定,而是強迫其執行虛函數的某個特定版本。可以使用作用域運算符實現這一目的。

// 強行調用基類中定義的函數版本而不管baseP的動態類型是什么 int a = baseP->Base::func(42); 

如果一個派生類虛函數需要調用它的基類版本,但是沒有使用作用域運算符,則在運行時該調用將被解析為對派生類版本自身的調用,從而導致無限遞歸。

二、純虛函數

1 . 定義

為了方便使用多態特性,我們常常需要在基類中定義虛函數。在許多情況下,在基類中不能對虛函數給出有意義的實現。為了讓虛函數在基類什么也不做,引進了“純虛函數”的概念,使函數無須定義。我們通過在函數體的位置(即在聲明語句的分號之前)書寫=0就可以將一個虛函數說明為純虛函數(pure virtual)。其中,=0只能出現在類內部的虛函數聲明語句處:

class Base{ // 抽象基類 public:   virtual int func(int n) const =0; }; 

需要注意的是,我們也可以為純虛函數提供定義,不過函數體必須定義在類的外部。

2 . 抽象基類

含有(或者未經覆蓋直接繼承)純虛函數的類叫抽象基類(abstract base class)。抽象基類負責定義接口,而后續的其他類可以覆蓋該接口。如果派生類中沒有重新定義純虛函數,而只是繼承基類的純虛函數,則這個派生類仍然還是一個抽象基類。因為抽象基類含有純虛函數(沒有定義),所以我們不能創建一個抽象基類的對象,但可以聲明指向抽象基類的指針或引用。

Base base;  // 錯誤,不能實例化抽象基類 

總結:

①.虛函數必須實現,不實現編譯器會報錯。

②.父類和子類都有各自的虛函數版本。由多態方式在運行時動態綁定。

③.通過作用域運算符可以強行調用指定的虛函數版本。

④.純虛函數聲明如下:virtual void funtion()=0; 純虛函數無需定義。包含純虛函數的類是抽象基類,抽象基類不能創建對象,但可以聲明指向抽象基類的指針或引用。

⑤.派生類實現了純虛函數以后,該純虛函數在派生類中就變成了虛函數,其子類可以再對該函數進行覆蓋。

⑥.析構函數通常應該是虛函數,這樣就能確保在析構時調用正確的析構函數版本。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费精品视频| 日韩激情视频在线| 国产精品羞羞答答| 中文字幕在线亚洲| 精品国产一区久久久| 亚洲护士老师的毛茸茸最新章节| 2025国产精品视频| 成人av在线天堂| 欧美性xxxx在线播放| 日产精品久久久一区二区福利| 国产亚洲精品美女久久久久| 色婷婷亚洲mv天堂mv在影片| 日韩综合中文字幕| 国产成人jvid在线播放| 深夜精品寂寞黄网站在线观看| 在线视频日韩精品| 国产香蕉精品视频一区二区三区| 国自产精品手机在线观看视频| 日韩av电影在线网| 久久精品国产99国产精品澳门| 国产97人人超碰caoprom| 国产精品极品美女粉嫩高清在线| 91夜夜揉人人捏人人添红杏| 青青久久aⅴ北条麻妃| 91影院在线免费观看视频| 少妇久久久久久| 国产精品欧美日韩一区二区| 色阁综合伊人av| 亚洲欧洲美洲在线综合| 日韩高清免费观看| 欧美日韩加勒比精品一区| 国产视频在线观看一区二区| 91精品国产综合久久男男| 国产一区玩具在线观看| 欧美老妇交乱视频| 欧美亚洲视频在线看网址| 中日韩美女免费视频网站在线观看| 国产极品jizzhd欧美| 91精品国产乱码久久久久久久久| 欧美一级电影在线| 91高清视频在线免费观看| 激情亚洲一区二区三区四区| 久久影院模特热| 亲子乱一区二区三区电影| 欧美多人爱爱视频网站| 91精品视频在线免费观看| 91成人国产在线观看| 午夜精品一区二区三区视频免费看| 亚洲欧美日韩天堂| 奇米影视亚洲狠狠色| 国产欧美婷婷中文| 国产999精品| 日韩高清电影免费观看完整版| 欧美精品电影在线| 欧美激情亚洲精品| 久久精品国产亚洲精品| 97视频网站入口| 欧美日韩日本国产| 久久五月情影视| 久久久中精品2020中文| 成人免费xxxxx在线观看| 欧美性猛交xxxx乱大交蜜桃| 成人黄色在线免费| 欧美精品在线观看| 日韩精品视频免费在线观看| 欧美日韩久久久久| 国产精品久久在线观看| 国产精品极品美女在线观看免费| 亚洲人线精品午夜| 欧美性猛交xxxx| 57pao成人国产永久免费| 韩国欧美亚洲国产| 91网站免费观看| 国产成人精品免高潮在线观看| 国产欧美一区二区三区久久| 久久久免费高清电视剧观看| 岛国av一区二区| 8090成年在线看片午夜| 久久久久久久网站| 国产成人精品a视频一区www| 国产自摸综合网| 97超级碰碰碰| 色综合天天狠天天透天天伊人| 欧美成人一二三| 久久综合亚洲社区| 欧美日韩免费看| 欧美日韩另类视频| 欧美精品激情在线| 亚洲一区二区久久久| 69久久夜色精品国产7777| 亚洲免费视频一区二区| 久久久精品中文字幕| 国产精品一二三在线| 日本一区二区不卡| 日韩a**中文字幕| 97国产精品视频人人做人人爱| 96sao精品视频在线观看| 日韩视频一区在线| 亚洲少妇中文在线| 亚洲自拍小视频免费观看| 亚洲理论电影网| 国产精品狠色婷| 亚洲一区二区免费在线| 国产精品福利小视频| 欧美国产在线视频| 伊人一区二区三区久久精品| 久久久精品久久| 欧美成人精品一区二区| 青青草一区二区| 日日摸夜夜添一区| 国产成+人+综合+亚洲欧美丁香花| 欧美猛男性生活免费| 国产精品亚洲аv天堂网| 亚洲成色777777在线观看影院| 国产区精品在线观看| 精品福利在线视频| 成年无码av片在线| 欧美极品少妇与黑人| 亚洲欧美一区二区激情| 亚洲国产欧美精品| 亚洲欧洲av一区二区| 国产91精品久久久| 最近2019年手机中文字幕| 国产精品久久久久国产a级| 91禁国产网站| 亚洲综合色av| 日韩av一区在线观看| 国产偷亚洲偷欧美偷精品| 欧美亚洲午夜视频在线观看| 九九九久久国产免费| 国产亚洲激情视频在线| 成人欧美一区二区三区在线| 91地址最新发布| 国产成人涩涩涩视频在线观看| 欧美精品在线免费播放| 久久精品成人一区二区三区| 国产精品久久久久久久久免费| 亚洲免费中文字幕| 成人444kkkk在线观看| 欧美日韩亚洲视频| 日韩欧美在线免费观看| 欧美日本精品在线| 日韩av一区在线观看| 欧美成人激情在线| www国产亚洲精品久久网站| 国产日本欧美一区| 美女视频黄免费的亚洲男人天堂| 日本精品一区二区三区在线播放视频| 亚洲自拍欧美色图| 国产小视频国产精品| 欧美激情啊啊啊| 欧美巨乳美女视频| www欧美日韩| 欧美性资源免费| 欧美性猛交视频| 日韩av一区在线观看| 国产精品av在线| 亚洲免费视频网站| 久久亚洲一区二区三区四区五区高| 国产精品久久久久久久一区探花| 久久久亚洲欧洲日产国码aⅴ| 国产成人精品视频在线观看| 伊人久久久久久久久久久| 日韩在线观看电影|