欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

什么是多態(tài)?

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

什么是多態(tài)?

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

多態(tài)三要素?

1,繼承

2,虛函數(shù)重寫

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

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

#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,父類指針指向子類對(duì)象
  pa->show();


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

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

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

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

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

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

圖片

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

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

圖片

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

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

你們:肯定可以啊,廢話

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

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

圖片

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

(int )&ch

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

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

圖片

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

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

    關(guān)注

    1

    文章

    482

    瀏覽量

    70613
  • 對(duì)象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

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

    關(guān)注

    0

    文章

    19

    瀏覽量

    2607
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    多態(tài)VI例子

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

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

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

    多態(tài)子VI已斷開(kāi),運(yùn)行該VI前必須解決多態(tài)子VI的所有錯(cuò)誤。

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

    請(qǐng)問(wèn)多態(tài)的必要條件是什么?

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

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

    如何完備地實(shí)現(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) 是什么,什么時(shí)候可以使用它們?解答:多態(tài) VI 最早是在 LabVIEW 6.0 被
    發(fā)表于 05-10 21:04

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    繼承是為了重用父類代碼。兩個(gè)類若存在IS-A的關(guān)系就可以使用繼承。,同時(shí)繼承也為實(shí)現(xiàn)多態(tài)做了鋪墊。那么什么是多態(tài)呢?多態(tài)的實(shí)現(xiàn)機(jī)制又是什么?請(qǐng)看我一一為你揭開(kāi):
    發(fā)表于 10-15 10:05 ?1462次閱讀
    java的封裝繼承和<b class='flag-5'>多態(tài)</b>