成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于C++虛函數那點破事

開發 后端
簡單地說,那些被virtual關鍵字修飾的成員函數,就是虛函數。一起來看本文,作者的觀點。

虛函數的作用是實現動態聯編,也就是在程序的運行階段動態地選擇合適的成員函數,在定義了虛函數后,可以在基類的派生類中對虛函數重新定義,在派生類中重新定義的函數應與虛函數具有相同的形參個數和形參類型。

如果你是C++程序員,我想你可能遇到過這樣的情況:

在debug時,對著一個函數step into,明明調用的是A函數,可是結果卻跳進了B函數。

為什么,call stack里顯示的也是明明白白,就是直接進了B函數。百思不得其解,于是你懷疑是不是系統出了問題,是不是編譯器出了問題,是不是調試器出了問題~~~

其實那些玩意不是那么容易出錯的,先看看你你的A,B函數是不是同一個類的虛函數,如果是,這極有可能是因為你修改過虛函數而沒有完全編譯引起的。

還沒明白?看看這個例子, 假設你在Project1中有一個名為KuQin.COM的類,該類有三個虛函數:

 

  1. class KuQin.COM  
  2. {  
  3. public:  
  4. virtual void f1();  
  5. virtual void f2();  
  6. virtual void f3();  
  7. }; 

 

在Project2中你調用了其虛函數:

 

  1. pDbgNow->f2(); 

 

之后由于某種需求你在這個類中加入了一個虛函數:

 

  1. class KuQin.COM  
  2. {  
  3. public:  
  4. virtual void f1();  
  5. virtual void f1_5();  
  6. virtual void f2();  
  7. virtual void f3();  
  8. }; 

 

只編譯Project1,在Project2中調用到pDbgNow->f2()時,你就會發現本文一開始描述的情況:明明調用的是f2(),結果卻進了f1_5()。理由如下:

pDbgNow->f2()之前被編譯為調用類KuQin.COM的第二個虛函數,因為是虛函數,其真正調用類似于pDbgNow->vtable[1]。因為在加入函數f1_5()后,f1_5成為了該虛表中的第二個函數,但由于沒有重新編譯Project2,pDbgNow->f2()的調用沒有更新為正確的pDgbNow->vtable[2],所以真正調用的是函數f1_5(),與函數名無關。

可能你會認為這種"低級錯誤"根本不會發生在你身上,至少有兩個方法來解決這個問題:

1.永遠把虛函數加到最后
 

2.永遠編譯所有的工程

的確,這兩招在一定程度上是有效的,但讓我們仔細分析一下:

1.永遠把虛函數加到最后,針對上面這個例子是有用的。

可是如果有其他類派生于類KuQin.COM,即使你把虛函數加到了類KuQin.COM的最后,還是會打亂其派生類的虛表。

2.永遠編譯所有的工程,這的確是一個保險的方法。

可是在一個大型系統中,編譯所有的代碼所耗費的時間是非常大的,加了一個虛函數,你可能得等上個好幾個小時才能看到最后的結果,這是我們不愿承受的。

那么,對于大型系統中一個正處于積極修改期的核心基類,一個比較好的操作方法是預先分配好足夠多的虛函數,這樣之后需要加虛函數是,只要修改一個原有的就行了,無需大規模的rebuild ,只需編譯一下用到了這個虛函數的代碼就可以了。可以說節省的時間是相當可觀的:

 

  1. class KuQin.COM  
  2. {  
  3. public:  
  4. virtual void f1();  
  5. virtual void f2();  
  6. virtual void f3();  
  7. virtual void dummyvirtualfunction1();  
  8. virtual void dummyvirtualfunction2();  
  9. virtual void dummyvirtualfunction3();  
  10. virtual void dummyvirtualfunction5();  
  11. virtual void dummyvirtualfunction6();  
  12. }; 

 

只要靈活運用dummyvirtualfunction,你不光可以運用于加虛函數,也可以在刪虛函數時發揮其作用。

記住兩個操作原則:

1.當dummyvirtualfunction快用完時,再預先分配一些。
 

2.當這一階段開發結束時,該基類趨于穩定,把多余的dummyvirtualfunction去掉就可以了。

【編輯推薦】

  1. 善于從bug中分析問題也是一種能力
  2. 淺談怎樣加快C++代碼的編譯速度
  3. 如何從網站數據分析挖掘核心服務
  4. 網站優化總結 網站PR值下降的16個原因
  5. 網站架設對于SEO的影響
責任編輯:于鐵 來源: Dbger的博客
相關推薦

2021-07-30 07:28:15

Kafka消息引擎

2010-02-01 11:22:09

C++虛函數

2022-07-18 15:32:37

C++虛函數表

2020-01-09 09:50:32

C++JavaPython

2010-01-18 17:38:54

C++虛函數表

2021-09-04 11:31:00

MYSQLSQL調優

2021-09-30 07:26:15

MQ消息丟失

2010-05-31 10:11:02

2011-08-30 14:59:34

Qt數據庫

2015-11-05 18:03:15

虛擬化云計算資源池

2024-04-22 13:22:00

虛函數象編程C++

2010-01-20 18:06:06

C++虛基類

2024-12-17 12:00:00

C++對象模型

2024-01-23 10:13:57

C++虛函數

2012-02-22 09:32:58

云計算微軟Azure

2011-04-14 14:23:06

軟件測試測試

2018-03-15 15:12:00

潤乾報表集成

2018-11-01 17:06:06

cell自適應高主

2010-01-27 10:36:54

C++虛函數

2010-02-05 13:35:19

C++虛析構函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品一区二区久久 | 99资源 | 亚洲视频二区 | 欧美13videosex性极品 | 波多野结衣中文视频 | 日日夜夜草| 国产成人在线视频 | 国产真实乱对白精彩久久小说 | 日韩成人免费 | 欧美激情黄色 | 亚洲精品9999 | 天天操夜夜操免费视频 | 国产精品99久久久久久动医院 | 亚洲综合国产 | 国产午夜在线 | 日韩一区在线观看视频 | 99在线播放 | 欧美美女爱爱 | 孕妇一级毛片 | 黄色国产视频 | 亚洲综合区| 国产精品色哟哟网站 | 国产日韩欧美一区二区 | 中文字幕亚洲一区二区三区 | 7777精品伊人久久精品影视 | 欧美激情一区二区 | 免费一级欧美在线观看视频 | 国产欧美精品区一区二区三区 | 无码日韩精品一区二区免费 | 欧美成人猛片aaaaaaa | 久久久国产一区二区三区 | 国产欧美久久一区二区三区 | 狠狠亚洲| 蜜桃精品噜噜噜成人av | 一区二区av在线 | 久久精品国产一区二区电影 | 日韩爱爱网| 亚洲精品乱 | av毛片| 久久久久亚洲精品 | 婷婷久久综合 |