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

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

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

多態(tài)性實(shí)現(xiàn)原理及其在面向?qū)ο缶幊讨械膽?yīng)用

冬至子 ? 來(lái)源:AI讓生活更美好 ? 作者:Andy ? 2023-06-08 14:19 ? 次閱讀

在面向?qū)ο蟮?a href="http://srfitnesspt.com/v/tag/1315/" target="_blank">編程中,多態(tài)性是一個(gè)非常重要的概念。多態(tài)性意味著在不同的上下文中使用同一對(duì)象時(shí),可以產(chǎn)生不同的行為。C++是一種面向?qū)ο蟮木幊陶Z(yǔ)言,在C++中,虛函數(shù)是實(shí)現(xiàn)多態(tài)性的關(guān)鍵。

什么是虛函數(shù)

虛函數(shù)是一個(gè)在基類中聲明的函數(shù),它可以被子類重寫(xiě)并提供不同的實(shí)現(xiàn)。在C++中,使用關(guān)鍵字virtual來(lái)聲明一個(gè)虛函數(shù)。虛函數(shù)的原理是將函數(shù)調(diào)用的控制權(quán)交給運(yùn)行時(shí)環(huán)境,而不是編譯時(shí)環(huán)境。因此,虛函數(shù)的實(shí)現(xiàn)需要在運(yùn)行時(shí)才能確定。虛函數(shù)的聲明形式如下:

virtual 返回類型 函數(shù)名(參數(shù)列表) {
   // 實(shí)現(xiàn)代碼
 }

例如:

class Shape {
   public:
     virtual void draw() {
       // 實(shí)現(xiàn)代碼
     }
 };
 
 class Circle : public Shape {
   public:
     void draw() override {
       // 實(shí)現(xiàn)代碼
     }
 };

在上面的例子中,Shape類定義了一個(gè)虛函數(shù)draw(),并在Circle類中重寫(xiě)了它。注意,在Circle類中的重寫(xiě)函數(shù)中使用了override關(guān)鍵字,這是C++11中引入的新特性,表示該函數(shù)是對(duì)基類中同名函數(shù)的重寫(xiě)。

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

當(dāng)使用基類指針或引用來(lái)訪問(wèn)派生類對(duì)象時(shí),如果虛函數(shù)已被重寫(xiě),將調(diào)用派生類中的實(shí)現(xiàn)。這種行為稱為運(yùn)行時(shí)多態(tài)性,因?yàn)閷?shí)際調(diào)用的函數(shù)是在運(yùn)行時(shí)確定的。例如:

Shape* s = new Circle();
 s- >draw(); // 調(diào)用Circle類中的draw()函數(shù)

在上面的例子中,我們使用基類指針s來(lái)訪問(wèn)Circle類的對(duì)象,因?yàn)?code>Circle類重寫(xiě)了draw()函數(shù),所以調(diào)用的是Circle類中的實(shí)現(xiàn)。這種行為可以使代碼更加靈活、可擴(kuò)展和易于維護(hù)。多態(tài)性的實(shí)現(xiàn)有兩種方式:靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)。靜態(tài)多態(tài)是通過(guò)函數(shù)重載實(shí)現(xiàn)的,而動(dòng)態(tài)多態(tài)是通過(guò)虛函數(shù)實(shí)現(xiàn)的。

靜態(tài)多態(tài)是在編譯時(shí)確定函數(shù)的調(diào)用,函數(shù)重載是靜態(tài)多態(tài)的一種形式。例如:

void print(int a) {
   // 實(shí)現(xiàn)代碼
 }
 
 void print(float b) {
   // 實(shí)現(xiàn)代碼
 }

在上面的例子中,我們定義了兩個(gè)函數(shù)print(),一個(gè)接受一個(gè)整數(shù)參數(shù),另一個(gè)接受一個(gè)浮點(diǎn)數(shù)參數(shù)。在調(diào)用print()函數(shù)時(shí),編譯器會(huì)根據(jù)傳遞的參數(shù)類型確定調(diào)用哪個(gè)函數(shù)。

動(dòng)態(tài)多態(tài)是在運(yùn)行時(shí)確定函數(shù)的調(diào)用。虛函數(shù)是動(dòng)態(tài)多態(tài)的一種形式。在使用虛函數(shù)時(shí),可以將基類指針或引用指向派生類對(duì)象,這樣就可以實(shí)現(xiàn)多態(tài)性調(diào)用。例如:

Shape* s = new Circle();
 s- >draw(); // 調(diào)用Circle類中的draw()函數(shù)

在上面的例子中,我們使用基類指針s來(lái)訪問(wèn)Circle類的對(duì)象,因?yàn)?code>Circle類重寫(xiě)了draw()函數(shù),所以調(diào)用的是Circle類中的實(shí)現(xiàn)。這種行為稱為運(yùn)行時(shí)多態(tài)性,因?yàn)閷?shí)際調(diào)用的函數(shù)是在運(yùn)行時(shí)確定的。

多態(tài)的底層原理

在C++中,多態(tài)是通過(guò)虛函數(shù)表和虛指針來(lái)實(shí)現(xiàn)的。虛函數(shù)表是一個(gè)特殊的表格,其中包含了虛函數(shù)的地址。每個(gè)類都有一個(gè)虛函數(shù)表,其中包含了該類及其基類的虛函數(shù)地址。當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),它將包含一個(gè)指向其類的虛函數(shù)表的指針,稱為虛指針。當(dāng)調(diào)用一個(gè)虛函數(shù)時(shí),程序?qū)⑹紫炔檎以搶?duì)象的虛指針,然后使用虛指針中的虛函數(shù)表來(lái)查找正確的函數(shù)地址。這種方法使得程序在運(yùn)行時(shí)能夠動(dòng)態(tài)地選擇正確的函數(shù)。

多態(tài)性的好處

多態(tài)性可以使代碼更加靈活、可擴(kuò)展和易于維護(hù)。多態(tài)性可以使代碼更加通用,可以使同樣的代碼適用于不同的對(duì)象。多態(tài)性可以提高代碼的復(fù)用性,可以減少代碼的重復(fù)編寫(xiě)。多態(tài)性可以使代碼更加易于維護(hù),因?yàn)榇a可以更加清晰、簡(jiǎn)潔和易于理解。

在實(shí)際編程中,多態(tài)性也是非常有用的。例如,我們可以使用多態(tài)性來(lái)編寫(xiě)一個(gè)通用的排序函數(shù),該函數(shù)可以對(duì)不同類型的數(shù)據(jù)進(jìn)行排序。另一個(gè)例子是圖形界面編程,我們可以使用多態(tài)性來(lái)處理不同的用戶輸入事件。

總結(jié)

虛函數(shù)是實(shí)現(xiàn)多態(tài)性的關(guān)鍵,它允許不同的對(duì)象表現(xiàn)出不同的行為。當(dāng)使用基類指針或引用來(lái)訪問(wèn)派生類對(duì)象時(shí),虛函數(shù)將調(diào)用派生類中的實(shí)現(xiàn),實(shí)現(xiàn)了運(yùn)行時(shí)多態(tài)性。在面向?qū)ο蟮木幊讨?,多態(tài)性是一個(gè)非常重要的概念,可以使代碼更加靈活、可擴(kuò)展和易于維護(hù)。多態(tài)性有兩種形式:靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)。靜態(tài)多態(tài)是通過(guò)函數(shù)重載實(shí)現(xiàn)的,而動(dòng)態(tài)多態(tài)是通過(guò)虛函數(shù)實(shí)現(xiàn)的。虛函數(shù)的底層原理可以參考我之前的帖子,有詳細(xì)的介紹,這里不做多展開(kāi)。最后,多態(tài)性可以使代碼更加通用、易于維護(hù)和提高復(fù)用性。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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

    文章

    1607

    瀏覽量

    48977
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6944
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式C語(yǔ)言面向對(duì)象編程---多態(tài)

    前兩篇文章主要講述了 C 語(yǔ)言面向對(duì)象編程– 封裝和繼承。本篇文章繼續(xù)來(lái)討論一下,如何使用 C 語(yǔ)言實(shí)現(xiàn)面向
    發(fā)表于 10-31 14:41 ?942次閱讀

    Python的面向對(duì)象編程詳解

    一般編程可分為面向過(guò)程編程,和面向對(duì)象編程。Python的
    發(fā)表于 09-04 16:35 ?488次閱讀
    Python的<b class='flag-5'>面向</b><b class='flag-5'>對(duì)象</b><b class='flag-5'>編程</b>詳解

    IC攻城獅求職寶典 06 比特大陸 筆試題

    請(qǐng)對(duì)面向對(duì)象編程多態(tài)性(polymorphism)的概念以及多態(tài)性對(duì)代碼可重用的意義進(jìn)行闡述。
    發(fā)表于 01-04 15:55

    LabVIEW面向對(duì)象的ActorFramework(1)

    產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱為多態(tài)性。多態(tài)性允許每個(gè)對(duì)象以適合自身的方式去響應(yīng)共同的消息。多態(tài)性增強(qiáng)了軟件的靈活性和重用。 簡(jiǎn)單的描述,就是
    發(fā)表于 02-10 14:09

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

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

    如何用C語(yǔ)言實(shí)現(xiàn)面向對(duì)象編程

    、組合、多態(tài)面向對(duì)象的功能,但C語(yǔ)言有struct和函數(shù)指針。我們可以用struct的數(shù)據(jù)和函數(shù)指針,以此來(lái)模擬對(duì)象和類的行為。所以
    發(fā)表于 07-12 07:24

    談?wù)?b class='flag-5'>面向對(duì)象編程

    工業(yè)控制系統(tǒng)的PLC程序也可以采用這種設(shè)計(jì)思想,雖然我們無(wú)法實(shí)現(xiàn)面向對(duì)象的很多優(yōu)秀特點(diǎn)如“繼承”,甚至于它根本就不具備面向
    發(fā)表于 09-08 07:47

    面向對(duì)象編程介紹

    目錄一、面向對(duì)象編程介紹1.面向過(guò)程編程2.函數(shù)式編程3.
    發(fā)表于 12-13 07:22

    基于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)的正確
    發(fā)表于 09-09 08:51 ?24次下載

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

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

    數(shù)據(jù)的共享和保護(hù)以及多態(tài)性_實(shí)驗(yàn)4

    c++面向對(duì)象課程實(shí)驗(yàn)指導(dǎo)書(shū)題目_數(shù)據(jù)的共享和保護(hù)以及多態(tài)性。
    發(fā)表于 01-14 16:25 ?0次下載

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

    Java多態(tài)性實(shí)現(xiàn) 什么是多態(tài) 面向對(duì)象的三大特性:封裝、繼承、
    發(fā)表于 09-27 10:36 ?9次下載

    面向對(duì)象編程——繼承與多態(tài)

    ,本公眾號(hào)特對(duì)《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》一書(shū)內(nèi)容進(jìn)行連載,愿共勉之。 第四章為 面向對(duì)象編程 ,本文為4.3 繼承與多態(tài) 。 4.3.1 抽象 假設(shè)需要設(shè)計(jì)一個(gè)處理工資單的數(shù)據(jù)包,可以將排
    的頭像 發(fā)表于 10-20 14:03 ?4401次閱讀
    <b class='flag-5'>面向</b><b class='flag-5'>對(duì)象</b><b class='flag-5'>編程</b>——繼承與<b class='flag-5'>多態(tài)</b>

    探討C++多態(tài)性技術(shù)的局限性及解決的辦法

    多態(tài)性是指發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí)有可能導(dǎo)致完全不同的行為。
    的頭像 發(fā)表于 01-08 11:06 ?3597次閱讀

    MISRA C++針對(duì)使用多態(tài)性的規(guī)避方法與建議

    本文主要介紹兩類實(shí)現(xiàn)形式的多態(tài)性需要注意的一些問(wèn)題:一是運(yùn)算符的重載,這是編譯時(shí)的多態(tài)性,即程序在編譯時(shí)就能根據(jù)重載的情況確定需要調(diào)用的
    的頭像 發(fā)表于 09-07 18:41 ?3496次閱讀
    MISRA C++針對(duì)使用<b class='flag-5'>多態(tài)性</b>的規(guī)避方法與建議