C++ 多態性(Polymorphism)和 虛函數(Virtual Functions)

在 C++ 中,多態性(Polymorphism)是面向對象編程的一個重要概念,它允許通過基類指針或引用來調用派生類對象的特定方法。虛函數(Virtual Functions)是實現多態性的一種機制,通過在基類中聲明虛函數,并在派生類中進行重寫,可以實現動態綁定,使程序在運行時確定應該調用哪個函數。

下面我將詳細解釋多態性和虛函數的概念,并提供一個示例來說明它們的用法。

  1. 多態性:
    多態性是指同一種操作或方法在不同的對象上產生不同的行為。在面向對象編程中,多態性通過繼承和重寫函數來實現。它允許我們使用基類的指針或引用來調用派生類的特定方法,從而實現針對不同對象的不同行為。

  2. 虛函數:
    虛函數是在基類中聲明的函數,可以在派生類中進行重寫。通過在基類函數聲明中添加 virtual 關鍵字,可以指示編譯器在運行時進行動態綁定,根據對象的實際類型選擇調用哪個函數。

    以下是一個示例,展示了多態性和虛函數的用法:

  #include <iostream>class Shape {public:virtual void draw() {std::cout << "繪制一個形狀" << std::endl;}};class Circle : public Shape {public:void draw() override {std::cout << "繪制一個圓形" << std::endl;}};class Rectangle : public Shape {public:void draw() override {std::cout << "繪制一個矩形" << std::endl;}};int main() {Shape* shape1 = new Circle();Shape* shape2 = new Rectangle();shape1->draw(); // 輸出:繪制一個圓形shape2->draw(); // 輸出:繪制一個矩形delete shape1;delete shape2;return 0;}

在這個示例中,我們定義了一個基類 Shape,并在其中聲明了一個虛函數 draw。然后,派生類 CircleRectangle 分別重寫了 draw 函數。

main 函數中,我們使用 Shape 的指針分別創建了 CircleRectangle 的對象,并通過基類指針調用它們的 draw 函數。由于 draw 函數在基類中被聲明為虛函數,因此在運行時會根據對象的實際類型選擇調用相應的函數。這就實現了多態性,使得我們可以通過基類指針來調用派生類的特定函數。

輸出結果為:

   繪制一個圓形繪制一個矩形

當我們有一個基類 Animal 和兩個派生類 DogCat 時,我們可以使用多態性和虛函數來實現不同類型的動物發出不同的聲音。

#include <iostream>class Animal {
public:virtual void makeSound() {std::cout << "動物發出聲音" << std::endl;}
};class Dog : public Animal {
public:void makeSound() override {std::cout << "狗發出汪汪聲" << std::endl;}
};class Cat : public Animal {
public:void makeSound() override {std::cout << "貓發出喵喵聲" << std::endl;}
};int main() {Animal* animal1 = new Dog();Animal* animal2 = new Cat();animal1->makeSound(); // 輸出:狗發出汪汪聲animal2->makeSound(); // 輸出:貓發出喵喵聲delete animal1;delete animal2;return 0;
}

在這個示例中,Animal 是一個基類,其中的 makeSound 函數被聲明為虛函數。派生類 DogCat 分別重寫了 makeSound 函數。在 main 函數中,我們使用基類指針分別創建了 DogCat 的對象,并通過這些指針調用了 makeSound 函數。

由于 makeSound 函數在基類中被聲明為虛函數,因此在運行時會根據對象的實際類型選擇調用相應的函數。這就實現了多態性,使得我們可以通過基類指針來調用派生類的特定函數。

輸出結果為:

狗發出汪汪聲
貓發出喵喵聲

通過多態性和虛函數,我們可以根據對象的實際類型來調用相應的函數,從而實現了不同類型的動物發出不同的聲音。這種靈活性和可擴展性使得我們能夠輕松地添加新的派生類,并在不改變現有代碼的情況下擴展程序的功能 , 使得程序能夠根據對象的實際類型來調用相應的函數。這種靈活性和可擴展性使得代碼更具有適應性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211953.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

InputStream和OutputStream速通

InputStream和OutputStream 輸入流&#xff08;InputStream&#xff09;&#xff1a; InputStream是抽象類&#xff0c;用于從各種數據源&#xff08;如文件、網絡連接、內存等&#xff09;讀取字節流。常見的子類包括FileInputStream、ByteArrayInputStream和SocketInputStrea…

電源小白入門學習1——電源系統架構和相關指標

電源小白入門學習1——電源系統架構和相關指標 電源系統架構電源系統的指標及測量方法電源的效率電源的靜態電流輸出電壓調整率紋波測量的注意事項動態負載測試 在開始本期內容之氣&#xff0c;我先簡單介紹一下我們電源小白學習系列內容&#xff1a;首先我是一個嵌入式小白&am…

【InsCode】新的代碼管理工具inscode教程它和Git以及SVN的區別

InsCode 實踐分享 InsCodeGitSVN類型代碼管理工具分布式版本控制系統集中式版本控制系統分支管理支持強大的分支管理功能&#xff0c;包括創建、合并和刪除分支支持分支管理&#xff0c;操作簡單快捷支持分支管理&#xff0c;但操作相對復雜代碼托管提供代碼托管功能&#xff…

在VSCode中運行Python腳本文件時如何傳參

以下實驗所處的操作系統環境說明&#xff1a; OS版本MacOSMonterey 12.1VSCodeOctober 2023 (version 1.84.2) 一、背景 在 VSCode 中寫好 Python 腳本后&#xff0c;如果要運行起來&#xff0c;可以怎么做呢&#xff1f; 一般有以下幾種方式&#xff1a; 1、直接在 VSCode…

sentinel整合nacos配置中心持久化

在網上找了很多的資料&#xff0c;發現sentinel整合nacos持久化的博文和視頻大多數都只有改造限流部分的教程&#xff0c;并且都需要修改前端&#xff0c;略顯麻煩&#xff0c;至于剩下的熔斷、熱點流控、授權的更是沒有相關的改造教程&#xff0c;最后在知乎的看到一篇文章后讓…

百科詞條可以刪除嗎?如何刪除自己的百度百科?

近日&#xff0c;小馬識途營銷顧問接到不少客戶刪除自己百科詞條的咨詢&#xff0c;有不少人自己并沒有去建立百科詞條&#xff0c;但是網上已經有了&#xff0c;有的信息不正確&#xff0c;甚至有的信息是負能量的&#xff0c;對當事人自己造成一定的困擾&#xff0c;所以尋求…

pytorch學習4-簡易卷積實現

系列文章目錄 pytorch學習1-數據加載以及Tensorboard可視化工具pytorch學習2-Transforms主要方法使用pytorch學習3-torchvisin和Dataloader的使用pytorch學習4-簡易卷積實現pytorch學習5-最大池化層的使用pytorch學習6-非線性變換&#xff08;ReLU和sigmoid&#xff09;pytorc…

【鴻蒙學習網絡】

鴻蒙技術學習相關學習資料 官方文檔&#xff1a;華為官方提供了鴻蒙開發者文檔&#xff0c;包括開發指南、API參考和示例代碼等。您可以訪問華為開發者中心網站&#xff08;https://developer.harmonyos.com/&#xff09;獲取最新的官方文檔和教程。在 線 課 程 &#xff1a; …

PbootCMS 前臺RCE漏洞復現

0x01 產品簡介 PbootCMS是全新內核且永久開源免費的PHP企業網站開發建設管理系統,是一套高效、簡潔、 強悍的可免費商用的PHP CMS源碼,能夠滿足各類企業網站開發建設的需要 0x02 漏洞概述 PbootCMS v<=3.1.6版本中存在模板注入,攻擊者可構造特定的鏈接利用該漏洞,執行…

線程及實現方式

一、線程 線程是一個基本的CPU執行單元&#xff0c;也是程序執行流的最小單位。引入線程之后&#xff0c;不僅是進程之間可以并發&#xff0c;進程內的各線程之間也可以并發&#xff0c;從而進一步提升了系統的并發度&#xff0c;使得一個進程內也可以并發處理各種任務&#x…

c語言的內存函數

memcpy函數 1.調用形式void*memcpy(void*p1,void*p2,int n)&#xff0c;表示從第二個位置復制n個字節到第一個位置&#xff0c;而指針類型為void的原因是他可以復制整型字符型甚至指針結構體類型的數據 2.在遇到\0的時候不會停下來&#xff0c;因為函數執行拷貝靠字節數&…

【Hive】——安裝部署

1 MetaData&#xff08;元數據&#xff09; 2 MetaStore &#xff08;元數據服務&#xff09; 3 MetaStore配置方式 3.1 內嵌模式 3.2 本地模式 3.3 遠程模式 4 安裝前準備 <!-- 整合hive --><property><name>hadoop.proxyuser.root.hosts</name><v…

Java+Swing: 主界面組件布局 整理9

說明&#xff1a;這篇博客是在上一篇的基礎上的&#xff0c;因為上一篇已經將界面的框架搭好了&#xff0c;這篇主要是將里面的組件完善。 分為三個部分&#xff0c;北邊的組件、中間的組件、南邊的組件 // 放置北邊的組件layoutNorth(contentPane);// 放置中間的 Jtablelayou…

Tair(3):Tair入門demo

新建一個maven項目 1 導入依賴 <dependency><groupId>com.taobao.tair</groupId><artifactId>tair-client</artifactId><version>2.3.5</version></dependency><dependency><groupId>com.alibaba</groupId>…

計算日期到天數轉換

根據輸入的日期&#xff0c;計算是這一年的第幾天。 保證年份為4位數且日期合法。 輸入描述&#xff1a;輸入一行&#xff0c;空格分割&#xff0c;分別是年&#xff0c;月&#xff0c;日 輸出描述&#xff1a;輸出是這一年的第幾天 輸入&#xff1a;2012 12 31 輸出&#xff…

Python計時器

制作一個簡單的Python計時器 在本教程中&#xff0c;我們將學習如何使用Python制作一個基礎的計時器。這個計時器將能夠開始計時、暫停、繼續和重置時間。 設計思路 為了建立一個計時器&#xff0c;我們需要定義一個能夠跟蹤時間的變量&#xff0c;并且定期更新顯示的時間。…

Linux權限(用戶角色+文件權限屬性)

Linux權限 文章目錄 Linux權限一.文件權限1.快速掌握修改權限的方法&#xff08;修改文件權限屬性&#xff09;2.對比權限的有無&#xff0c;以及具體的體現3.修改權限的第二套方法&#xff08;修改用戶角色&#xff09;4.文件類型&#xff08;Linux下一切皆文件&#xff09; 二…

049:VUE 引入jquery的方法和配置

第049個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…

springboot基礎(80):redis geospatial的應用

文章目錄 前言redis geospatial如何從地圖上獲取經緯度springboot 的相關方法調用準備redis服務器引用的依賴預設位置的keyGEOADD 添加位置GEORADIUS 獲取指定經緯度附件的停車場&#xff08;deprecated&#xff09;GEORADIUS 獲取指定成員附件的停車場&#xff08;deprecated&…

文心一言API(高級版)使用

文心一言API高級版使用 一、百度文心一言API(高級版)二、使用步驟1、接口2、請求參數3、請求參數示例4、接口 返回示例 三、 如何獲取appKey和uid1、申請appKey:2、獲取appKey和uid 四、重要說明 一、百度文心一言API(高級版) 基于百度文心一言語言大模型的智能文本對話AI機器…