吴忠躺衫网络科技有限公司

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

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

3天內不再提示

什么是多態?

汽車電子技術 ? 來源:C語言Plus ? 作者:Maye426 ? 2023-02-27 15:58 ? 次閱讀

什么是多態?

父類指針即根據指向的不同對象,響應同一消息(函數調用),產生不同行為。

多態三要素?

1,繼承

2,虛函數重寫

3,父類指針(引用)指向子類對象

多態的實現很簡答,讓我們來看一段代碼

#include
using namespace std;
class Parent
{
public:
  virtual void show()
{
    cout << "我是你爹" << endl;
  }
};
class Child:public Parent//1,繼承
{
public:
  virtual void show()//2,虛函數重寫
{
    cout << "我是你崽" << endl;
  }
};


int main()
{
  Parent *pa = new Child;//3,父類指針指向子類對象
  pa->show();


  getchar();
  return 0;
}
//結果輸出的是子類的show函數--"我是你崽"

實現很簡單,但是這又是什么原理呢?

當我們在類中聲明了虛函數之后,編譯器會給類添加一個vptr指針,當定義對象的時候,會把所有虛函數放入一個叫虛函數表的順序表,然后用vptr指針指向虛函數表。當進行pa->show();調用的時候,C++編譯器不需要區分子類或者父類對象,只需要在pa指針中,找到vptr指針即可。

如果對象類型是子類,就調用子類的函數;如果對象類型是父類,就調用父類的函數,(即指向父類調父類,指向子類調子類)此為多態的表現。

既然類里面有vptr指針,那么我們能找到它嗎?

咱們一起來探究下:首先看下加了虛函數的類的大小有沒有變化。

圖片

可以看到加了虛函數,類的大小比沒有增加虛函數的類,多了四個字節的空間,有的同學可能會說,四個字節的類型不一定是指針。不要著急,讓我們繼續往下看。

接下來我們定義對象,然后通過調試,看下局部變量窗口

圖片

從這里就可以明確看到,子類對象中有一個vptr指針,而且它是對象的第一個成員,它的類型是void**,指向的是一個順序表,下標為0的元素裝的是我們聲明的虛函數。

那么,知道了這些,咱們能利用對象找到虛函數表,然后自己手動調用虛函數嗎?

你們:肯定可以啊,廢話

我:。。。那就廢話不多說,歐力給!搞起

我:首先畫一張內存模型圖,瞅瞅(畫工太丑,見諒)

圖片

1,首先,要拿到vptr指針,怎么拿呢?因為它在對象的第一個元素,所以我們先對對象取地址&ch,這樣就拿到了對象的地址。對象的元素的內存是連續的,但是現在指針的步長是Child類的大小,我們需要把它當成一個整型數組(因為vptr是四個字節),所以需要強轉成int*,即(int*)&ch,這樣之后數組第一個元素就是vptr指針了,取值即可得到

(int )&ch

2,然后,前面通過調試我們知道了,vptr指針是void**類型的,所以我們也要講它轉為int*,然后取值. (int )( (int )&ch),這樣就拿到了虛函數表的第一個元素。

3,但是,現在拿到的元素是int*型,不是函數指針,無法調用,所以我們需要強轉為函數指針,才能進行調用。

圖片

你學廢了沒?嘿嘿

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

    關注

    1

    文章

    481

    瀏覽量

    70611
  • 對象
    +關注

    關注

    1

    文章

    38

    瀏覽量

    17419
  • 函數調用
    +關注

    關注

    0

    文章

    19

    瀏覽量

    2607
收藏 人收藏

    評論

    相關推薦

    C++的多態詳解

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

    多態VI例子

    多態VI例子,希望大家喜歡
    發表于 06-26 17:16

    【資料】多態子VI

    多態子VI,剛看到的,分享給大家,希望對新學者有幫助。。。。。。
    發表于 12-11 13:50

    多態子VI已斷開,運行該VI前必須解決多態子VI的所有錯誤。

    多態子VI已斷開,運行該VI前必須解決多態子VI的所有錯誤。外部連接了USB-4711的采集卡,等有正常顯示;
    發表于 01-14 20:35

    請問多態的必要條件是什么?

    什么是多態多態的必要條件是什么?
    發表于 11-06 06:22

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

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

    LabVIEW多態 VI (Polymorphic VIs)的使用

    LabVIEW多態 VI (Polymorphic VIs)的使用多態 VI (Polymorphic VIs) 是什么,什么時候可以使用它們?解答:多態 VI 最早是在 LabVIEW 6.0 被
    發表于 05-10 21:04

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

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

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

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

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

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

    java多態性的實現

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

    多態路由機制研究

    如何基于有限且確定的路由結構來支持多樣化服務是當前研究面臨的問題,采用路由結構的自組織和自調節來實現路由與業務的自適配,提出一種面向多樣化服務定制的多態路由機制。該機制通過自適配網絡路由結構的基本微
    發表于 03-13 16:43 ?2次下載
    <b class='flag-5'>多態</b>路由機制研究

    JAVA教程之消息、繼承與多態的應用和資料介紹說明

    本文檔的主要內容詳細介紹的是JAVA教程之消息、繼承與多態的應用和資料介紹說明主要內容包括了:1 消息,2 訪問控制,3 多態機制 ,4 繼承機制,5 抽象類、接口與包
    發表于 01-16 11:02 ?0次下載
    JAVA教程之消息、繼承與<b class='flag-5'>多態</b>的應用和資料介紹說明

    Java中的多態有哪些表現形式

    學習Java語言的過程中,對于多態的理解是非常關鍵的,理解了多態也就意味著打開了理解Java各種“抽象”的大門。
    發表于 09-10 15:50 ?2020次閱讀

    java的封裝繼承和多態

    繼承是為了重用父類代碼。兩個類若存在IS-A的關系就可以使用繼承。,同時繼承也為實現多態做了鋪墊。那么什么是多態呢?多態的實現機制又是什么?請看我一一為你揭開:
    發表于 10-15 10:05 ?1458次閱讀
    java的封裝繼承和<b class='flag-5'>多態</b>
    百家乐官网赌博机怎么玩| bet365进不去| 百家乐和怎么算输赢| 广州百家乐桌子| 精通百家乐的玩法技巧和规则 | 百家乐官网策略与心得| 瑞金市| 百家乐官网群柏拉图软件| 百家乐官网书| 百家乐官网详情| 网上玩百家乐官网好吗| 百家乐官网开户送8彩金| 八大胜百家乐官网娱乐城| 大赢家百家乐官网的玩法技巧和规则 | 保靖县| 在线百家乐官网博彩网| 百家乐官网稳赢技法| 大上海百家乐官网娱乐城| 百家乐的视频百家乐| 金海岸百家乐的玩法技巧和规则 | 百家乐投资心得| 百家乐电子路单破解| 百家乐五湖四海赌场娱乐网规则| 百家乐扑克多少张| 澳门百家乐网络游戏信誉怎么样| 德州扑克大小顺序| 金城百家乐官网玩法| 百家乐官网真人游戏娱乐网| 立即博百家乐官网现金网| 百家乐官网制胜法| 百家乐投注最好方法| 威尼斯人娱乐场棋牌| 汇丰娱乐城| 百家乐官网信誉平台现金投注| 沙龙百家乐官网娱乐场开户注册 | 大发888真钱游戏| 昆山市| 现场百家乐官网机| 百家乐任你博娱乐场开户注册| 时时博娱乐城评级| 新朝代百家乐官网开户网站|