色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是多態(tài)?

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

什么是多態(tài)?

父類指針即根據(jù)指向的不同對象,響應(yīng)同一消息(函數(shù)調(diào)用),產(chǎn)生不同行為。

多態(tài)三要素?

1,繼承

2,虛函數(shù)重寫

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

多態(tài)的實現(xiàn)很簡答,讓我們來看一段代碼

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


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


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

實現(xiàn)很簡單,但是這又是什么原理呢?

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

如果對象類型是子類,就調(diào)用子類的函數(shù);如果對象類型是父類,就調(diào)用父類的函數(shù),(即指向父類調(diào)父類,指向子類調(diào)子類)此為多態(tài)的表現(xiàn)。

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

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

圖片

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

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

圖片

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

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

你們:肯定可以啊,廢話

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

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

圖片

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

(int )&ch

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

3,但是,現(xiàn)在拿到的元素是int*型,不是函數(shù)指針,無法調(diào)用,所以我們需要強轉(zhuǎn)為函數(shù)指針,才能進(jìn)行調(diào)用。

圖片

你學(xué)廢了沒?嘿嘿

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70573
  • 對象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    17402
  • 函數(shù)調(diào)用
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    2592
收藏 人收藏

    評論

    相關(guān)推薦

    C++的多態(tài)詳解

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

    多態(tài)VI例子

    多態(tài)VI例子,希望大家喜歡
    發(fā)表于 06-26 17:16

    【資料】多態(tài)子VI

    多態(tài)子VI,剛看到的,分享給大家,希望對新學(xué)者有幫助。。。。。。
    發(fā)表于 12-11 13:50

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

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

    請問多態(tài)的必要條件是什么?

    什么是多態(tài)多態(tài)的必要條件是什么?
    發(fā)表于 11-06 06:22

    如何完備地實現(xiàn)C++多態(tài)性?

    如何完備地實現(xiàn)C++多態(tài)性?虛函數(shù)怎么使用?
    發(fā)表于 04-28 06:44

    LabVIEW多態(tài) VI (Polymorphic VIs)的使用

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

    基于Java多態(tài)性的應(yīng)用程序設(shè)計

    Java 中的多態(tài)體現(xiàn)在類的繼承和實現(xiàn)接口等方面。通過對與多態(tài)有關(guān)的概念進(jìn)行歸納比較,從繼承和接口兩方面對多態(tài)的正確實現(xiàn)進(jìn)行分析,結(jié)合實例說明多態(tài)性在程序設(shè)計中的
    發(fā)表于 09-09 08:51 ?24次下載

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

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

    C++的動態(tài)多態(tài)和靜態(tài)多態(tài)

    多態(tài)是 C++ 中面向?qū)ο蠹夹g(shù)的核心機制之一包含靜態(tài)多態(tài)和動態(tài)多態(tài)它們之間有一定的相似性但是應(yīng)用范圍不同該文論述了這種相似性并重點論述了以模板實現(xiàn)的靜態(tài)多態(tài)的應(yīng)用范圍
    發(fā)表于 06-29 15:41 ?41次下載
    C++的動態(tài)<b class='flag-5'>多態(tài)</b>和靜態(tài)<b class='flag-5'>多態(tài)</b>

    java多態(tài)性的實現(xiàn)

    Java中多態(tài)性的實現(xiàn) 什么是多態(tài) 面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。從一定角度來看,封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的。這是我們最后一個概念,也是最重要的知識點。
    發(fā)表于 09-27 10:36 ?9次下載

    多態(tài)路由機制研究

    如何基于有限且確定的路由結(jié)構(gòu)來支持多樣化服務(wù)是當(dāng)前研究面臨的問題,采用路由結(jié)構(gòu)的自組織和自調(diào)節(jié)來實現(xiàn)路由與業(yè)務(wù)的自適配,提出一種面向多樣化服務(wù)定制的多態(tài)路由機制。該機制通過自適配網(wǎng)絡(luò)路由結(jié)構(gòu)的基本微
    發(fā)表于 03-13 16:43 ?2次下載
    <b class='flag-5'>多態(tài)</b>路由機制研究

    JAVA教程之消息、繼承與多態(tài)的應(yīng)用和資料介紹說明

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

    Java中的多態(tài)有哪些表現(xiàn)形式

    學(xué)習(xí)Java語言的過程中,對于多態(tài)的理解是非常關(guān)鍵的,理解了多態(tài)也就意味著打開了理解Java各種“抽象”的大門。
    發(fā)表于 09-10 15:50 ?2001次閱讀

    java的封裝繼承和多態(tài)

    繼承是為了重用父類代碼。兩個類若存在IS-A的關(guān)系就可以使用繼承。,同時繼承也為實現(xiàn)多態(tài)做了鋪墊。那么什么是多態(tài)呢?多態(tài)的實現(xiàn)機制又是什么?請看我一一為你揭開:
    發(fā)表于 10-15 10:05 ?1444次閱讀
    java的封裝繼承和<b class='flag-5'>多態(tài)</b>
    主站蜘蛛池模板: 热久久免费频精品99热 | 久久精品热线免费| 国产99久久| www国产av偷拍在线播放| 2019午夜福利757视频第12集| 亚洲偷自拍精品视频在线观看| 性做久久久久久久久浪潮| 四虎影5151毛片在线看| 色橹橹欧美在线观看视频高清| 日本九九热在线观看官网| 人妻无码AV中文系列| 飘雪韩国在线观看免费高清完整版| 墨西哥美女主播| 内射无码AV-区二区在线观看| 狂野欧美性猛XXXX乱大交| 绝对诱惑在线试听| 麻豆国产精品久久人妻| 久久一级视频| 蜜桃人妻无码AV天堂三区| 免费看男人J放进女人J无遮掩| 口内射精颜射极品合集| 免费韩国伦理2017最新| 欧美xxxxxbb| 欧美自拍亚洲综合图区| 日本护士喷水| 偷窥美女3| 亚洲精品蜜桃AV久久久| 一个人免费观看HD完整版| 永久免费的无码中文字幕| 2019天天射干网站| 被吊起玩弄的女性奴| 国产av免费观看日本| 国产欧美一区二区三区免费| 极品少妇高潮啪啪AV无码| 久久亚洲精品AV成人无| 嗯别插太快好深再深点| 热久久2018亚洲欧美| 无套内射CHINESEHD| 亚洲人成在线观看一区二区| 中文字幕日本在线mv视频精品| 99视频国产热精品视频|