C++編程(八)多態

文章目錄

  • 一、多態
    • (一)概念
      • 1. 多態
      • 2. 函數重寫
      • 3. 虛函數
    • (二)實現多態的條件
      • 1. 繼承關系
      • 2. 父類中寫虛函數
      • 3. 在子類中重寫父類的虛函數
      • 4.父類的指針或引用指向子類的對象
      • 5. 使用示例
    • (三)虛析構函數
    • (四)純虛函數和抽象類

一、多態

(一)概念

1. 多態

多態是泛型編程的一種。
泛型編程是一種程序設計風格,它允許程序員在編寫代碼時使用以后才指定的類型,通過這種方式,可以編寫出適用于多種數據類型的通用代碼,從而提高代碼的復用性和效率。

多態:通過調用一個公共成員函數產生不同的形態;

分類:
靜態多態:在編譯階段就確定地址。如:函數重載,運算符重載
動態多態:在運行階段確定地址

2. 函數重寫

函數重寫:在子類中重寫父類的相同的函數,稱之為函數重寫。

函數重載:相同的作用域,相同的函數名,不同的形參表構成函數重載
函數重寫:相同的函數名,相同的參數,相同的返回值,函數體可以不同。

  • 注:函數重寫必須發生在基類和派生類之間;

3. 虛函數

C++在聲明和定義函數的時候,在前面加上vittual關鍵字,就稱為虛函數

(二)實現多態的條件

1. 繼承關系

2. 父類中寫虛函數

3. 在子類中重寫父類的虛函數

在子類中重寫父類的虛函數時,不加virtual關鍵字也是在重新虛函數;
也可以加上virtual,但是一般不加。

4.父類的指針或引用指向子類的對象

5. 使用示例

#include <iostream>
#include <string>using namespace std;class Hero{
protected:string name;int life=100;
public:Hero(){}Hero(string n,int l):name(n),life(l){}~Hero(){}virtual void reduce_life(){life--;}int get_life(){return life;}
};class Master:public Hero{
private:string skill;
public:Master():Hero(){}Master(string n,int l,string s):Hero(n,l),skill(s){}~Master(){}void reduce_life(){life-=500;}
};class Shooter:public Hero{
private:int attack;
public:Shooter():Hero(){}Shooter(string n,int l,int a):Hero(n,l),attack(a){}~Shooter(){}void reduce_life(){life-=300;}
};//全局函數
void fight_wild(Hero &h){ //相當于父類的引用指向了子類的對象h.reduce_life();
}int main()
{Master m("妲己",4000,"愛心攻擊");Shooter s("魯班七號",4500,300);fight_wild(m);fight_wild(s);cout<<"m.life="<<m.get_life()<<endl;cout<<"s.life="<<s.get_life()<<endl;return 0;
}

(三)虛析構函數

構造函數、拷貝構造函數和拷貝賦值函數不能實現虛函數
析構函數可以實現虛函數

(四)純虛函數和抽象類

只有函數的聲明,沒有函數的定義的虛函數稱之為純虛函數。

純虛函數的語法格式:

virtual void show(){}
virtual void show()=0;//花括號和函數體換成=0
  • 注:
  • 如果寫成純虛函數就必須在子類中進行重寫父類的虛函數
  • 如果類中有純虛函數則這個類稱之為抽象類
  • 如果類中的成員函數全部都是純虛函數則這個類稱之為純抽象類
#include <iostream>
#include <string>using namespace std;class Drink{
protected:
public:virtual void Boil()=0;virtual void Brew()=0;virtual void PourIncup()=0;virtual void PutSomthing()=0;void Drink_make(){Boil();Brew();PourIncup();PutSomthing();}
};class Coffee:public Drink{
private:
public:void Boil(){cout<<"燒水"<<endl;}void Brew(){cout<<"沖泡咖啡"<<endl;}void PourIncup(){cout<<"倒入杯中"<<endl;}void PutSomthing(){cout<<"加糖和牛奶"<<endl;}
};class Tea:public Drink{
private:
public:void Boil(){cout<<"燒水"<<endl;}void Brew(){cout<<"沖泡茶葉"<<endl;}void PourIncup(){cout<<"倒入杯中"<<endl;}void PutSomthing(){cout<<"加珍珠和奶"<<endl;}
};int main()
{Coffee c;Tea t;c.Drink_make();cout<<"**********"<<endl;t.Drink_make();return 0;
}

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

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

相關文章

springboot項目jar包修改數據庫配置運行時異常

一、背景 我將軟件成功打好jar包了&#xff0c;到部署的時候發現jar包中數據庫配置寫的有問題&#xff0c;不想再重新打包了&#xff0c;打算直接修改配置文件&#xff0c;結果修改配置后&#xff0c;再通過java -jar運行時就報錯了。 二、問題描述 本地項目是springBoot項目…

【計算機圖形學 | 基于MFC三維圖形開發】期末考試知識點匯總(上)

文章目錄 視頻教程第一章 計算機圖形學概述計算機圖形學的定義計算機圖形學的應用計算機圖形學 vs 圖像處理 vs模式識別圖形顯示器的發展及工作原理理解三維渲染管線 第二章 基本圖元的掃描轉換掃描轉換直線的掃描轉換DDA算法Bresenham算法中點畫線算法圓的掃描轉換中點畫圓算法…

Java中的持續集成與持續部署

Java中的持續集成與持續部署 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討Java中的持續集成&#xff08;Continuous Integration&#xff…

熟練掌握Docker及linux常用命令排查線上問題。熟悉Git, Maven等項目管理及構建工具,熟悉微服務中基于Jenkins的CI/CD

掌握Docker、Linux命令、項目管理及構建工具&#xff0c;以及CI/CD流程是現代軟件開發和運維的關鍵技能。以下是對這些技能的概述和一些實踐建議&#xff1a; ### Docker - **概述**&#xff1a;Docker是一個開源的容器化平臺&#xff0c;允許開發者打包應用及其依賴到一個可移…

【Godot4.2】Godot中的貝塞爾曲線

概述 通過指定平面上的多個點&#xff0c;然后順次連接&#xff0c;我們可以得到折線段&#xff0c;如果閉合圖形&#xff0c;就可以獲得多邊形。通過向量旋轉我們可以獲得圓等特殊圖形。 但是對于任意曲線&#xff0c;我們無法使用簡單的方式來獲取其頂點&#xff0c;好在計…

mac上使用finder時候,顯示隱藏的文件或者文件夾

默認在finder中是不顯示隱藏的文件和文件夾的&#xff0c;但是想創建.gitignore文件&#xff0c;并向里面寫入內容&#xff0c;即便是打開xcode也是不顯示這幾個隱藏文件的&#xff0c;那有什么辦法呢&#xff1f; 使用快捷鍵&#xff1a; 使用finder打開包含隱藏文件的文件夾…

Linux如何安裝openjdk1.8

文章目錄 Centosyum安裝jdk和JRE配置全局環境變量驗證ubuntu使用APT(適用于Ubuntu 16.04及以上版本)使用PPA(可選,適用于需要特定版本或舊版Ubuntu)Centos yum安裝jdk和JRE yum install java-1.8.0-openjdk-devel.x86_64 安裝后的目錄 配置全局環境變量 vim /etc/pr…

ISP IC/FPGA設計-第一部分-SC130GS攝像頭分析-IIC通信(1)

1.攝像頭模組 SC130GS通過一個引腳&#xff08;SPI_I2C_MODE&#xff09;選擇使用IIC或SPI配置接口&#xff0c;通過查看攝像頭模組的原理圖&#xff0c;可知是使用IIC接口&#xff1b; 通過手冊可知IIC設備地址通過一個引腳控制&#xff0c;查看攝像頭模組的原理圖&#xff…

中日區塊鏈“大比拼”!中國螞蟻加大區塊鏈押注資本!日本索尼進軍加密貨幣市場!

科技巨頭在區塊鏈和加密貨幣領域的動作越來越頻繁。近期&#xff0c;中國金融科技巨頭螞蟻集團進一步加大了在區塊鏈業務上的投資&#xff0c;而日本電子科技巨頭索尼集團則正式進軍加密貨幣交易領域。這些舉措反映了兩國對于區塊鏈和加密資產領域的不同態度和布局。 螞蟻集團加…

disql使用

進入bin目錄&#xff1a;cd /opt/dmdbms/bin 啟動disql&#xff1a;./disql&#xff0c;然后輸入用戶名、密碼 sh文件直接使用disql&#xff1a; 臨時添加路徑到PATH環境變量&#xff1a;在當前會話中臨時使用disql命令而無需每次都寫完整路徑&#xff0c;可以在執行腳本之前…

973. 最接近原點的 K 個點-k數組維護+二分查找

973. 最接近原點的 K 個點-k數組維護二分查找 給定一個數組 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一個點&#xff0c;并且是一個整數 k &#xff0c;返回離原點 (0,0) 最近的 k 個點。 這里&#xff0c;平面上兩點之間的距離是 歐幾里德距離&#…

洗衣機水龍頭要買有止逆閥的,多花幾十元能省掉幾萬,值了

問大家一下&#xff0c;你家洗衣機水龍頭用的是什么樣的&#xff1f;      可能有業主會說我家買的是純銅的&#xff0c;質量挺好的。      如果你家選的洗衣機水龍頭僅僅是純銅的&#xff0c;并沒有其他的功能&#xff0c;你還是選做錯了。      因為洗衣機水龍頭…

初學嵌入式是弄linux還是單片機?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「單片機的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;1、先入門了51先學了89c52…

leetcode每日一練:鏈表OJ題

鏈表經典算法OJ題 1.1 移除鏈表元素 題目要求&#xff1a; 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 輸出&a…

學習java第一百一十八天

Component 和 Bean 的區別是什么&#xff1f;Component 注解作用于類&#xff0c;而Bean注解作用于方法。Component通常是通過類路徑掃描來自動偵測以及自動裝配到 Spring 容器中&#xff08;我們可以使用 ComponentScan 注解定義要掃描的路徑從中找出標識了需要裝配的類自動裝…

Nacos 配置中心:動態加載 Bean

前提&#xff1a; 已經集成好 springboot / cloud 與nacos的環境 1 nacos中配置文件參數 message:#sender: emailMessageSendersender: smsMessageSender 2 接口和兩個實現類 public interface MessageSender {String sendMessage(String message, String recipient); }impo…

模電-二極管及其應用51單片機LED點亮前置工作!

今日小記 2024-7-2&#xff0c;星期二&#xff0c;16:32&#xff0c;天氣&#xff1a;晴&#xff0c;心情&#xff1a;晴。持續了兩個星期的梅雨天終于暫時過去啦&#xff0c;迎來了久違的陽光&#xff0c;雖然沒有雨天涼快&#xff0c;但是能看到太陽也是開心噠&#xff0c;心…

2021強網杯

一、環境 網上自己找 二、步驟 2.1拋出引題 在這個代碼中我們反序列&#xff0c;再序列化 <?php$raw O:1:"A":1:{s:1:"a";s:1:"b";};echo serialize(unserialize($raw));//O:1:"A":1:{s:1:"a";s:1:"b";…

工業 web4.0UI 風格品質卓越

工業 web4.0UI 風格品質卓越

深入理解 RabbitMQ、RocketMQ等常?的消息中間件進?消息的異步數據處理

深入理解消息中間件對于構建高可用、高性能的分布式系統至關重要。以下是對RabbitMQ和RocketMQ這兩種常用消息中間件的異步數據處理的深入理解&#xff1a; ### RabbitMQ RabbitMQ是一個開源的消息代理&#xff0c;它支持多種消息協議&#xff0c;如AMQP、STOMP等&#xff0c;…