精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

詳談C++特性:多態的概念分類和實現原理

如意 ? 來源:CSDN ? 作者:cherrydreamsover ? 2020-06-29 12:54 ? 次閱讀

一、多態的概念

在說多態之前,我們來先看一看對象的類型

詳談C++特性:多態的概念分類和實現原理

來看一個例子:

詳談C++特性:多態的概念分類和實現原理

多態:意思既是同一個事物的多種形態,用我們C++的專業詞語來說就是:一個借口、多種實現方式。

二、多態分類

詳談C++特性:多態的概念分類和實現原理

靜態多態:

靜態多態:編譯器在編譯期間完成的,編譯器根據函數實參的類型(可能會進行隱式類型轉換),可推斷出要調用那個函數,如果有對應的函數就調用該函數,否則出現編譯錯誤。

動態多態:

動態多態就是我們常說的多態。動態多態是在程序運行期間才決定調用哪個函數,是根據虛函數表實現的。聲明了虛函數的類,類中都有一張虛函數表,里面存放類的入口地址。通過賦值兼容規則,可以用父類的指針或引用找到子類的虛函數。虛函數是處理類的派生體系中不同層次上不同作用域的同名問題,因此動態多態必須在類的繼承體系中才能實現。

三、多態的實現原理(動態)

說到這里,有幾個非常重要的概念,需要我們加以區分:重載、重寫、重定義

通過上面的多態的介紹,這里來說幾個重要的概念:

(1)虛函數表指針:類中除了定義成員函數之外還有一個成員是虛函數表指針(占四個基本內存單位),這個指針指向一個虛函數表的起始位置,這個表會與類的定義同時出現,這個表會與類的定義同時出現,這個表存放著該類的虛函數指針,調用的時候可以找到該類虛函數表指針,通過虛函數表指針找到虛函數表,通過虛函數表的偏移找到函數的入口地址,從而找到要使用的虛函數。

(2)當實例化一個該類的子類對象的時候,(如果)該類的子類并沒有定義虛函數,但是卻從父類中繼承了虛函數,所以在實例化該類子類對象的時候也會產生一個虛函數表,這個虛函數表是子類的虛函數表,但是記錄的子類的虛函數地址卻是與父類的是一樣的。所以通過子類對象的虛函數表指針找到自己的虛函數表,在自己的虛函數表找到的要執行的函數指針也是父類的相應函數入口的地址。

(3)如果我們在子類中定義了從父類繼承來的虛函數,對于父類來說情況是不變的,對于子類來說它的虛函數表與之前的虛函數表是一樣的,但是此時子類定義了自己的(從父類那繼承來的)相應函數,所以它的虛函數表當中管于這個函數的指針就會覆蓋掉原有的指向父類函數的指針的值,換句話說就是指向了自己定義的相應函數,這樣如果用父類的指針,指向子類的對象,就會通過子類對象當中的虛函數表指針找到子類的虛函數表,從而通過子類的虛函數表找到子類的相應虛函數地址,而此時的地址已經是該函數自己定義的虛函數入口地址,而不是父類的相應虛函數入口地址,所以執行的將會是子類當中的虛函數。這就是多態的原理。

(4)純虛函數

在成員函數的參數列表后面寫上“=0”則該成員函數為純虛函數。

包含純虛函數的類叫做抽象類(也叫接口類),抽象類不能實例化出對象。

純虛函數在抽象類中重新定義以后,派生類才能實現實例化出對象。

詳談C++特性:多態的概念分類和實現原理

總結:

(1)派生類重寫基類的虛函數實現多態,要求函數名、參數列表、返回值完全相同(協變除外)

協變:基類和派生類中的虛函數名字和參數列表相同、返回值類型不同,基類中的虛函數返回Base*,派生類中的虛函數返回Derived*

(2)基類中定義了虛函數,在派生類中該函數始終保持虛函數的特性。

(3)只有類的非靜態成員函數才能定義為虛函數,靜態成員函數不能定義為虛函數。

(4)如果在類外定義虛函數,只能在聲明函數時加virtual關鍵字,定義時不用加。

(5)構造函數不能定義為虛函數,雖然可以將operator=定義為虛函數,但最好不要這么做,使用時容易混淆

(6)不要在構造函數和析構函數中調用虛函數,在構造函數和析構函數中,對象是不完整的,可能會出現未定義的行為。

(7)最好將基類的析構函數聲明為虛函數。(析構函數比較特殊,因為派生類的析構函數跟基類的析構函數名稱不一樣,但是構成覆蓋,這里編譯器做了特殊處理)

(8)虛表是對所有類對象實例共用的

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

    關注

    21

    文章

    2084

    瀏覽量

    73297
  • 動態多態
    +關注

    關注

    0

    文章

    4

    瀏覽量

    5894
  • 靜態多態
    +關注

    關注

    0

    文章

    2

    瀏覽量

    5479
收藏 人收藏

    評論

    相關推薦

    C++多態詳解

    在編程語言和類型論中,多態(英語:polymorphism)指為不同數據類型的實體提供統一的接口。多態類型(英語:polymorphic type)可以將自身所支持的操作套用到其它類型的值上。
    發表于 09-20 17:18 ?423次閱讀

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

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

    STM32 C++代碼封裝初探相關資料推薦

    一、STM32與面向對象編程上一章中提到了,C++的核心之一就在于面向對象思想。相比C語言常用的面向過程編程,面向對象編程的優勢在于繼承、封裝、多態特性,利用這種思想更有助于我們的程
    發表于 02-11 06:05

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

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

    java多態性的實現

    Java中多態性的實現 什么是多態 面向對象的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為
    發表于 09-27 10:36 ?9次下載

    C++程序設計教程之多態的詳細資料說明

    本文檔詳細介紹的是C++程序設計教程之多態的詳細資料說明主要內容包括了:1.繼承召喚多態 (Inheritance Summon up Polymorphism) ,2.抽象編程的困惑
    發表于 02-22 10:52 ?9次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>多態</b>的詳細資料說明

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

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

    C++三大特性:封裝的概念原理

    我們都知道C++有三大特性:封裝、繼承、多態,之前我總結過繼承的知識點,現在來總結一下封裝的相關知識!
    的頭像 發表于 06-29 14:28 ?6364次閱讀
    <b class='flag-5'>C++</b>三大<b class='flag-5'>特性</b>:封裝的<b class='flag-5'>概念</b>原理

    C++基礎語法中的引用、封裝和多態

    本期是C++基礎語法分享的第六節,今天給大家來分享一下: (1)引用; (2)宏; (3)成員初始化列表; (4)封裝; (5)繼承; (6)多態; 引用 左值引用 常規引用,一般表示對象的身份
    的頭像 發表于 09-12 09:58 ?1241次閱讀

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

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

    STM32 C++編程系列二:STM32 C++代碼封裝初探

    一、STM32與面向對象編程上一章中提到了,C++的核心之一就在于面向對象思想。相比C語言常用的面向過程編程,面向對象編程的優勢在于繼承、封裝、多態特性,利用這種思想更有助于我們的程
    發表于 12-08 11:06 ?13次下載
    STM32 <b class='flag-5'>C++</b>編程系列二:STM32 <b class='flag-5'>C++</b>代碼封裝初探

    如何通過poly實現C++編譯期多態

      而folly::poly出來的晚一些,主要使用c++的新特性實現相關的功能,依賴比較少,所以本文將更多的以poly的實現來分析編譯期多態
    的頭像 發表于 12-05 09:10 ?559次閱讀

    虛函數,C++開發者如何有效利用

    虛函數是基類中聲明的成員函數,且使用者期望在派生類中將其重新定義。那么,在 C++ 中,什么是虛函數呢?在 C++ 中,通常將虛函數用于實現運行時多態,該
    的頭像 發表于 02-11 09:39 ?831次閱讀

    深度解析C++中的虛函數

    虛函數作為C++的重要特性,讓人又愛又怕,愛它功能強大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語法的偽裝,重新認識一下虛函數。 虛函數是C++實現面向對象設計
    的頭像 發表于 02-15 11:14 ?736次閱讀
    深度解析<b class='flag-5'>C++</b>中的虛函數

    C++實現類似instanceof的方法

    C++多態與繼承,但是很多人開始學習C++,有時候會面臨一個常見問題,就是如何向下轉型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有insta
    的頭像 發表于 07-18 10:16 ?351次閱讀
    <b class='flag-5'>C++</b>中<b class='flag-5'>實現</b>類似instanceof的方法