在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MISRA C++針對使用多態性的規避方法與建議

電子設計 ? 來源:單片機與嵌入式系統應用 ? 作者:王璽 , 邵貝貝 ? 2020-09-07 18:41 ? 次閱讀

多態性是C++的一個重要特征。從廣義上說,多態性是指一段程序能夠處理多種類型對象的能力;具體地講,多態性就是對不同對象發出同樣的指令時,不同對象會有不同的行為。

如果程序員充分利用C++的多態性,設計程序的運行方式會更加靈活多樣,但是會帶來一些暗藏的細節問題。這些細節的漏洞也許會通過編譯,但是在某些情況下,不可預測的結果或者背離編程者初衷的結果都會導致程序變得混亂不堪,甚至產生較大的風險。為了規避這些風險,MISRA C++推薦了一些編程規則。這些規則能夠幫助程序員更加完備或者完美地實現多態性,充分體現C++相比于傳統C語言的一些優勢。

本文主要介紹兩類在實現形式的多態性中需要注意的一些問題:一是運算符的重載,這是編譯時的多態性,即程序在編譯時就能根據重載的情況確定需要調用的函數;二是虛函數的使用,這是運行時的多態性,即在程序執行前,無法根據函數名和參數來確定調用哪個函數,必須在程序執行過程中,根據執行的具體情況來動態確定。

1 運算符的重載

運算符重載就是定義某個運算符對于某個類的具體含義。通過運算符的重載,程序員可以針對一些特定的類型使用重載的運算符含義。

規則5-2-11(強制):逗號(,),與(&&)以及或(||)運算符不允許被重載。

如果getValue和setValue的返回類型使用重載運算符&&,則這兩個函數都需要計算。

C++的內部規定是,&&和||都是在已知結果的情況下不再計算后面的值,比如0&&(a--)&& (b++)。然而重載&&運算符和||運算符導致了程序運行時要計算所有的表達式。這對于一些使用&&做判斷的運算來說,會導致一些錯誤。比如getchar()&&putchar(),在讀取文件時,如果讀到文件尾部,即得到getchar()為0時,就不需要再執行putchar()了,這樣才能正確地讀取并輸出文件。如果重載&&運算符,那么先需要計算getchar()和 putchar()的結果,再執行&&運算符的重載定義,這樣可能會導致一些不可知的錯誤。這樣的重載,會導致編譯器在處理&&和||運算符時產生混亂,所以是比較危險的。

對于逗號表達式來說,默認情況下,編譯器按照逗號表達式規定的順序計算各個表達式。但是如果重載操作逗號表達式,因為需要先檢查逗號兩邊的表達式類型,來判斷是否使用重載定義的類型,所以會導致計算順序的混亂。這樣比較危險,會產生一些不可知的錯誤。雖然在C++并沒有限制這3個運算符的重載問題,但是從這個例程和MISRA C++的規則來看,有些時候會產生一些不可預知的錯誤,所以MISRA C++不允許重載上面3個運算符。

規則5-3-3(強制):單目運算符&不允許被重載。

f1.cc和f2.cc的區別就在于f1.cc只聲明了A類,而f2.cc包含了A.h。f1.cc僅聲明A類,不會使用A類定義的重載運算,所以 f1.cc的8L運算符使用C++內部的取地址定義。f2.cc包含了頭文件A.h,因為A.h包含了A類的完整定義,所以f2.cc的&運算符就會使用用戶定義的重載操作。在同樣一個工程中,僅僅是對A類的聲明不同,就導致了在f2.cc中,&a使用用戶定義的&運算符含義,而在f1.cc中,&a使用C++內部定義的&運算符含義。

這樣差別會導致程序員在重載&運算符后,無法得知&運算符有沒有使用重載的定義。這樣做是比較危險的,可能會產生與程序員意愿不同的結果。雖然在C++中并沒有限制對單目運算符的重載操作,但是從上面的例程可以看出,MISRA C++不允許重載&運算符是很有必要的。

2 虛函數的使用

虛函數是C++中一類特殊的函數。在基類中定義一個虛函數,就說明該函數在派生類中可能有不同的實現方式。當派生類的實例調用這個虛函數時,首先會在派生類中去查看該函數有沒有被定義。如果派生類定義了這個函數,則執行派生類的函數;否則,在派生路徑上尋找最近的該函數的定義,并調用該函數。

如果從基類派生出多個派生類,那么每個派生類都可以重新定義這個虛函數。如果通過基類的指針指向派生類的對象,并訪問該虛函數,會對應地調用每個派生類的函數定義。這樣通過基類類型的指針,就可以使屬于不同派生類的對象產生不同的行為,從而實現了運行過程的多態。

關于虛函數,MISRA C++有以下幾條規則:

規則10-3-1(強制):在每一個繼承路徑上,虛函數只能有一個定義。防止按優先度調用。

例外:析構函數可以定義為虛函數,在每一個派生類上都可以有定義。

如果一個函數在同一個類中被聲明為純虛函數,但是還有定義,這樣的定義就會被忽略。

在例程的后半段是關于按優先度調用的解釋,表1顯示的是例程中每個函數的調用和定義關系。b2.f1()是按照正常的繼承關系來調用foo()函數,并且調用的是V類中foo()的定義。d.f2()和d.f1()都是按照優先度調用的。它們雖然最后都是調用了foo()函數,但是經過的繼承路徑卻不相同,而且它們最后只能調用到B1類中foo()的定義。為了防止這種情況發生,所以Misra C++規定,虛函數在一個繼承路徑上,只能有一個函數定義。

例程的前半部分描述了多個類的繼承關系,每個類都包括對幾個函數的定義和聲明。這里簡單介紹一下f1()函數,讀者可以通過表2的內容來理解其他函數。 f1在A類中是虛函數,而且有定義,在C類中有定義,所以當D類繼承C類時,D類中就不能再有定義(“√”表示可以定義,“*”表示不推薦再繼續定義)。例外是f4,雖然它在A類中有定義,但是因為它是純虛函數,所以它的定義會被忽略。

這個規則說明,如果在一個繼承路徑上有兩個函數定義,在調用函數時,有可能按照繼承的優先度調用函數。這樣就會導致函數調用的混亂,可能會調不到程序員希望的函數。這是在實現多態時需要特別注意的地方。關于繼承路徑上的函數定義,C++并沒有明確限制。

從上面的例程可以看出,如果沒有這樣的限制,就會產生一些混亂,雖然程序能夠正常運行,但是不一定能夠按照程序員所設計的方式運行。這樣的運行方式會出現很多漏洞,所以MISRA C++強制規定在每一個繼承路徑上,虛函數只能有一個定義。

規則10-3-2(強制):每一個重載的虛函數應該用關鍵字virtual來聲明。

這樣做不需要檢查基類,就可以確定函數是否為虛函數。MISRA C++推出這樣的規則是為了使C++程序更加完善。

規則10-3-3(強制):只有被聲明為純虛函數的虛函數,才能被純虛函數重載。

foo函數在A類中定義為純虛函數,在B類中被重載為普通虛函數。而C類使用純虛函數重載foo函數。這樣做是不行的。

B類中foo函數重載A類的foo函數時,是用有定義的虛函數重載純虛函數,這樣做是可以的。

C類中的foo函數重載B類的foo函數時,是用純虛函數重載一個非純虛函數,這樣是不行的。在C類中,foo被定義為純虛函數,在C類的對象調用foo 函數時無法調用到B類中的定義。這樣的重載導致B類中對foo函數的定義丟失。

所以MISRA C++不允許使用純虛函數重載非純虛函數,這樣做的目的也是為了使C++程序更加安全。

3 小結

正確并完備地實現C++的多態性,能夠充分發揮C++的優勢,并且提高程序的可讀性和可維護性。如果使用不當,會導致一些想象不到的程序漏洞。MISRA C++針對使用多態性可能產生的一些漏洞,提出了規避的方法與建議。本文列出了其中幾條比較關鍵和實用的規則。關于多態性的其他規則,讀者可以查看。 MISRA C++(2008),以避免不正確使用多態性所導致的一些程序漏洞。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73771
  • 編譯器
    +關注

    關注

    1

    文章

    1640

    瀏覽量

    49222
收藏 人收藏

    評論

    相關推薦

    如何完備地實現C++多態性

    如何完備地實現C++多態性?虛函數怎么使用?
    發表于 04-28 06:44

    利用P2P的網絡特性構造多態性密碼

    為了解決沒有第三方認證的情況下,P2P 網絡通信過程中對等點的授權問題,本文基于P2P 網絡中對等點的信任度管理,提出了利用P2P 網絡結構的特點來構造一個多態性密碼的新方法
    發表于 06-20 09:35 ?8次下載

    基于Java多態性的應用程序設計

    Java 中的多態體現在類的繼承和實現接口等方面。通過對與多態有關的概念進行歸納比較,從繼承和接口兩方面對多態的正確實現進行分析,結合實例說明多態性在程序設計中的
    發表于 09-09 08:51 ?24次下載

    什么是方法的重載(多態性)?

    什么是方法的重載(多態性)? 在同一個類中至少有兩個方法用同一個名字,但有不同的參數。
    發表于 04-28 14:28 ?1276次閱讀
    什么是<b class='flag-5'>方法</b>的重載(<b class='flag-5'>多態性</b>)?

    C++的動態多態和靜態多態

    多態C++ 中面向對象技術的核心機制之一包含靜態多態和動態多態它們之間有一定的相似但是應用范圍不同該文論述了這種相似
    發表于 06-29 15:41 ?41次下載
    <b class='flag-5'>C++</b>的動態<b class='flag-5'>多態</b>和靜態<b class='flag-5'>多態</b>

    數據的共享和保護以及多態性_實驗4

    c++面向對象課程實驗指導書題目_數據的共享和保護以及多態性
    發表于 01-14 16:25 ?0次下載

    java多態性的實現

    Java中多態性的實現 什么是多態 面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而準備的。這是我們最后一個概念,也是最重要的知識點。
    發表于 09-27 10:36 ?9次下載

    探討C++多態性技術的局限性及解決的辦法

    多態性是指發出同樣的消息被不同類型的對象接收時有可能導致完全不同的行為。
    的頭像 發表于 01-08 11:06 ?3655次閱讀

    C++課程資料詳細資料合集包括了:面向對象程序設計與C++,算法,函數等

    ,循環,多態性,數組,模板,習題,STL編程,預處理,指針,結構體,位運算,文件,常見錯誤,c++模板使用疑問等
    發表于 07-09 08:00 ?18次下載
    <b class='flag-5'>C++</b>課程資料詳細資料合集包括了:面向對象程序設計與<b class='flag-5'>C++</b>,算法,函數等

    C++程序設計教程之多態性與虛函數的詳細資料說明

    本文檔詳細介紹的是C++程序設計教程之多態性與虛函數的詳細資料說明主要資料包括了:1 多態性的概念,2 一個典型的例子,3 虛函數,4 純虛函數與抽象類
    發表于 03-14 16:39 ?5次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>多態性</b>與虛函數的詳細資料說明

    C++中如何用虛函數實現多態

    01 — C++虛函數探索 C++是一門面向對象語言,在C++里運行時多態是由虛函數和純虛函數實現的,現在我們看下在C++中如何用虛函數實現
    的頭像 發表于 09-29 14:18 ?1719次閱讀

    多態性實現原理及其在面向對象編程中的應用

    在面向對象的編程中,多態性是一個非常重要的概念。
    的頭像 發表于 06-08 14:19 ?673次閱讀

    您需要了解的有關下一個MISRA?標準的信息:MISRA C++ 2023?簡介

    軟件可靠協會(MISRA)開發的一套CC++編碼標準,不僅是汽車行業的最佳標準之一,也是任何使用嵌入式系統的行業的最佳標準之一。
    的頭像 發表于 08-25 18:06 ?1366次閱讀
    您需要了解的有關下一個<b class='flag-5'>MISRA</b>?標準的信息:<b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b> 2023?簡介

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?842次閱讀
    使用 <b class='flag-5'>MISRA</b> <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    embOS的MISRA-C:2012一致

    MISRA C是汽車工業軟件可靠協會(MISRA)開發的一套針對C編程語言的軟件開發指南,目的
    的頭像 發表于 08-20 11:35 ?556次閱讀
    主站蜘蛛池模板: 欧美系列在线播放| 六月婷婷视频| 乱小说录目伦200篇将曲勒| 一区二区在线观看高清| 男人午夜影院| 狼人综合色| 99久久伊人一区二区yy5099| 天天爱综合| 综合色图| 超h 高h 污肉男男| 五月天精品| 尤物久久99热国产综合| 清纯漂亮小美女准备啪啪| 天天槽天天槽天天槽| 免费看大美女大黄大色| 成人牲交一极毛片| 57pao成人永久免费视频| 在线欧美三级| 丁香综合在线| avtt天堂网 手机资源| 午夜啪啪网站| 成年女人免费看一级人体片| 免费网站啪啪大全| 狼色网站| 高清一区高清二区视频| 天天摸日日舔| 性欧美长视频| 日a在线| 久久99精品久久久久久久野外| 免费一级毛片女人图片| 国产亚洲第一伦理第一区| 国产精品嫩草影院在线播放| 综合色影院| 午夜手机福利| 五月天狠狠| 人人揉人人爽五月天视频| 亚洲激情四射| 国模张文静啪啪私拍337p| 在线网站你懂得| 亚洲v在线| 免费大片黄在线观看日本|