RM新时代网站-首页

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

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

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

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

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

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

什么是虛函數(shù)

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

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

例如:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

多態(tài)性的好處

多態(tài)性可以使代碼更加靈活、可擴展和易于維護。多態(tài)性可以使代碼更加通用,可以使同樣的代碼適用于不同的對象。多態(tài)性可以提高代碼的復(fù)用性,可以減少代碼的重復(fù)編寫。多態(tài)性可以使代碼更加易于維護,因為代碼可以更加清晰、簡潔和易于理解。

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

總結(jié)

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

聲明:本文內(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

    文章

    1623

    瀏覽量

    49108
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6987
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    Python的面向對象編程詳解

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

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

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

    LabVIEW面向對象的ActorFramework(1)

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

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

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

    如何用C語言實現(xiàn)面向對象編程

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

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

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

    面向對象編程介紹

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

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

    Java 多態(tài)體現(xiàn)在類的繼承和實現(xiàn)接口等方面。通過對與多態(tài)有關(guān)的概念進行歸納比較,從繼承和接口兩方面對多態(tài)的正確
    發(fā)表于 09-09 08:51 ?24次下載

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

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

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

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

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

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

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

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

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

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

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

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