在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

多態性實現原理及其在面向對象編程中的應用

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

在面向對象的編程中,多態性是一個非常重要的概念。多態性意味著在不同的上下文中使用同一對象時,可以產生不同的行為。C++是一種面向對象的編程語言,在C++中,虛函數是實現多態性的關鍵。

什么是虛函數

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

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

例如:

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

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

多態性的實現

當使用基類指針或引用來訪問派生類對象時,如果虛函數已被重寫,將調用派生類中的實現。這種行為稱為運行時多態性,因為實際調用的函數是在運行時確定的。例如:

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

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

靜態多態是在編譯時確定函數的調用,函數重載是靜態多態的一種形式。例如:

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

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

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

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

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

多態的底層原理

在C++中,多態是通過虛函數表和虛指針來實現的。虛函數表是一個特殊的表格,其中包含了虛函數的地址。每個類都有一個虛函數表,其中包含了該類及其基類的虛函數地址。當一個對象被創建時,它將包含一個指向其類的虛函數表的指針,稱為虛指針。當調用一個虛函數時,程序將首先查找該對象的虛指針,然后使用虛指針中的虛函數表來查找正確的函數地址。這種方法使得程序在運行時能夠動態地選擇正確的函數。

多態性的好處

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

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

總結

虛函數是實現多態性的關鍵,它允許不同的對象表現出不同的行為。當使用基類指針或引用來訪問派生類對象時,虛函數將調用派生類中的實現,實現了運行時多態性。在面向對象的編程中,多態性是一個非常重要的概念,可以使代碼更加靈活、可擴展和易于維護。多態性有兩種形式:靜態多態和動態多態。靜態多態是通過函數重載實現的,而動態多態是通過虛函數實現的。虛函數的底層原理可以參考我之前的帖子,有詳細的介紹,這里不做多展開。最后,多態性可以使代碼更加通用、易于維護和提高復用性。

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

    關注

    1

    文章

    1651

    瀏覽量

    49710
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    7168
收藏 人收藏

    評論

    相關推薦

    嵌入式C語言面向對象編程---多態

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

    Python的面向對象編程詳解

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

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

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

    LabVIEW面向對象的ActorFramework(1)

    產生不同的結果,這種現象稱為多態性多態性允許每個對象以適合自身的方式去響應共同的消息。多態性增強了軟件的靈活性和重用。 簡單的描述,就是
    發表于 02-10 14:09

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

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

    如何用C語言實現面向對象編程

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

    談談面向對象編程

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

    面向對象編程介紹

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

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

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

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

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

    數據的共享和保護以及多態性_實驗4

    c++面向對象課程實驗指導書題目_數據的共享和保護以及多態性。
    發表于 01-14 16:25 ?0次下載

    java多態性實現

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

    面向對象編程——繼承與多態

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

    探討C++多態性技術的局限性及解決的辦法

    多態性是指發出同樣的消息被不同類型的對象接收時有可能導致完全不同的行為。
    的頭像 發表于 01-08 11:06 ?3719次閱讀

    MISRA C++針對使用多態性的規避方法與建議

    本文主要介紹兩類實現形式的多態性需要注意的一些問題:一是運算符的重載,這是編譯時的多態性,即程序在編譯時就能根據重載的情況確定需要調用的
    的頭像 發表于 09-07 18:41 ?3687次閱讀
    MISRA C++針對使用<b class='flag-5'>多態性</b>的規避方法與建議
    主站蜘蛛池模板: 国产精品情人露脸在线观看 | 七月丁香八月婷婷综合激情 | 天堂资源在线8 | 亚洲一区在线视频观看 | 国产偷窥女洗浴在线观看亚洲 | 午夜影院在线看 | 免费人成激情视频在线观看冫 | 日本成人在线网址 | 日本一区不卡在线观看 | 中文字幕v视界影院 | 婷婷午夜 | 久久青| 2021久久天天躁狠狠躁夜夜 | 亚洲无线码一区在线观看 | 国产美女一区二区三区 | 四虎网址最新 | 色多多视频在线播放 | 视频网站免费 | 国产男女免费视频 | 五月情视频在线观看 | 天天综合色天天综合色sb | 天天躁夜夜躁狠狠躁2021西西 | 亚洲精品二区中文字幕 | 国产一区二区高清 | 国产亚洲欧美一区二区 | 大桥未久加勒比女热大陆在线 | 51国产| 欧美一级免费观看 | 最近高清免费观看视频大全 | 丁香婷婷综合五月综合色啪 | 日本特黄特黄刺激大片免费 | 久久刺激| 特级毛片免费视频观看 | 韩国免费三片在线视频 | 亚洲欧美在线一区二区 | 天天干天天操天天舔 | 狼狼色丁香久久女婷婷综合 | 亚洲卡1卡2卡新区网站 | 欧美 亚洲 国产 丝袜 在线 | 色婷婷色综合 | 天天操天天插天天射 |