cpp自學 day19(多態)

一、基本概念

同一操作作用于不同的對象,產生不同的執行結果
👉 就像「按F1鍵」:在Word彈出幫助文檔,在PS彈出畫筆設置,?同一個按鍵觸發不同功能


(1)多態類型

類型實現方式綁定時機
?靜態多態函數重載、運算符重載編譯時綁定
?動態多態虛函數+繼承體系運行時綁定

(2)動態多態三要素

多態滿足條件
  • 有繼承關系
  • 子類重寫父類中的虛函數
多態使用條件
  • 父類指針或引用指向子類對象

重寫:函數返回值類型 函數名 參數列表 完全一致稱為重寫 (缺一不可)

class 父類名 {
public:virtual 返回類型 函數名(參數列表) {// 函數體}
};

(3)示例代碼

// 父類
class Animal {
public:virtual void speak() {  // 1. 虛函數聲明cout << "動物發聲" << endl;}
};// 子類
class Cat : public Animal { // 1. 繼承關系
public:void speak() override { // 2. 重寫虛函數cout << "喵喵" << endl; }
};// 多態調用
void doSpeak(Animal& animal) { // 3. 父類引用接收子類對象animal.speak(); // 運行時決定調用哪個實現
}void doSpeak(Animal *animal) {// 4.用指針接收子類對象animal->speak();
}void test() {Cat cat;doSpeak(cat); // 輸出:喵喵
}

(4)重要特性

?函數重寫嚴格一致:(此處是函數內參數不一致)

// 錯誤示例:參數不同
class Animal { virtual void func(int) };
class Cat : public Animal { void func() }; // 不會觸發多態

二、多態原理

當子類重寫父類的虛函數,子類中的虛函數表內部,會替換成 子類的虛函數地址

class Animal
{
public://虛函數virtual void speak(){cout << "動物在說話" << endl;}
};
//貓類
class Cat : public Animal
{
public://重寫 函數返回值類型 函數名 參數列表 完全相同virtual void speak(){cout << "小貓在說話" << endl;}
};

原理概況

當父類的指針或者引用指向子類對象時候,發生多態

Animal & animal = cat;
animal.speak();
vfptr - 虛函數(表)指針v - virtual
f - function
ptr - pointervtable - 虛函數表v - virtual
f - function
table - table

三、純虛函數和抽象類

在多態中,通常父類中虛函數的實現是毫無意義的,主要都是調用子類重寫的內容

因此可以將虛函數改為純虛函數,當類中有了純虛函數,這個類也稱為抽象類

純虛函數語法:virtual 返回值類型 函數名(參數列表)= 0 ;

 virtual void func() = 0;

抽象類特點:
1、無法實例化對象

若Base是抽象類,則下面兩行報錯
Base b;
new Base;

2、子類必須重寫抽象類中的純虛函數,否則也屬于抽象類

寫純虛函數意義就是想讓子類重寫一遍純虛函數


四、虛析構與純虛析構

1.核心問題

內存泄漏場景

class Animal {
public:~Animal() {  // ? 普通析構cout << "Animal析構" << endl;}
};class Cat : public Animal {
public:~Cat() {cout << "Cat析構" << endl;delete[] m_data;  // 堆內存資源}
private:int* m_data = new int[100];
};void test() {Animal* pet = new Cat();pet->speak();delete pet;  // 僅調用Animal析構 → 內存泄漏!
}

執行結果

Animal析構
(Cat析構未被調用 → m_data內存泄漏)

2.解決方案對比

方案類型語法示例類性質實現要求使用場景
?虛析構virtual ~Animal() {}普通類必須實現需要實例化基類對象
?純虛析構virtual ~Animal() = 0;抽象類必須單獨實現強制子類實現特定行為

3.具體實現

1. 虛析構函數

class Animal {
public:virtual ~Animal() {  // ? 虛析構聲明cout << "Animal虛析構" << endl;}
};// 正確執行結果:
// Cat析構
// Animal虛析構

2. 純虛析構函數

class Animal {
public:virtual ~Animal() = 0;  // 純虛析構聲明
};// 必須單獨實現
Animal::~Animal() {  // ? 純虛析構實現cout << "Animal純虛析構" << endl;
}

特性

  • 使類成為抽象類(無法實例化)
  • 子類必須實現析構函數
class Cat : public Animal {
public:~Cat() override {  // 必須實現cout << "Cat析構" << endl;}
};

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

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

相關文章

Java 大視界 -- Java 大數據在航天遙測數據分析中的技術突破與應用(177)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

人臉考勤管理一體化系統(人臉識別系統,簽到打卡)

人臉考勤管理一體化系統 項目介紹 本項目是基于Flask、SQLAlchemy、face_recognition庫的人臉考勤管理一體化系統。 系統通過人臉識別技術實現員工考勤打卡、人臉信息采集、人臉模型訓練等功能。 項目采用前后端分離的技術框架&#xff0c;基于Flask輕量級Web框架搭建后端服務…

單調棧學習C++

目錄 一&#xff0c;每日溫度 二&#xff0c;下一個更大的元素I 三&#xff0c;下一個更大的元素II 四&#xff0c;接雨水 小結&#xff1a; 單調棧是一種特殊的棧結構&#xff0c;里面的元素按照單調遞增或者遞減的順序排列。常用于解決元素左邊或者右邊比它大或者小的問…

網絡釣魚攻擊的威脅和執法部門的作用(第一部分)

在當今的數字世界中&#xff0c;網絡犯罪分子不斷開發新技術來利用個人、企業和政府機構。 最普遍和最具破壞性的網絡犯罪形式之一是網絡釣魚——一種社會工程手段&#xff0c;用于欺騙人們提供敏感信息&#xff0c;例如登錄憑據、財務數據和個人詳細信息。 隨著網絡釣魚攻擊…

左值與右值,空間與數據

左值是空間&#xff0c;右值是數據 編程總是對“數據”&#xff0c;對"存放數據的空間"操作 a返回一個當前的數據&#xff0c;存放到一個臨時空間中&#xff0c;自身的空間中的數據再進行運算 a直接對自身空間中的數據進行運算 其余知識&#xff1a; 1.變量名的意…

無人機飛行術語科普!

一、基礎操作類 1. 炸機 指無人機意外墜毀或嚴重損壞&#xff08;如撞樹、撞樓、失控摔機等&#xff09;。 例句&#xff1a;“今天風太大&#xff0c;差點炸機&#xff01;” 2. 一鍵放生 調侃某些情況下無人機失控飛丟&#xff0c;無法找回&#xff08;源自某些品牌…

模擬算法(一):一維數組模擬

目錄 模擬的概念 例1&#xff1a;開關燈 算法思路&#xff1a; 代碼如下&#xff1a; 輸入輸出&#xff1a; 例2&#xff1a;序列操作和查詢 算法思路&#xff1a; 代碼如下&#xff1a; 輸入輸出&#xff1a; 例3&#xff1a;數組折疊 算法思路&#xff1a; 代碼如…

MySQL 基礎入門

寫在前面 關于MySQL的下載安裝和其圖形化軟件Navicat的下載安裝,網上已經有了很多的教程,這里就不再贅述了,本文主要是介紹了關于MySQL數據庫的基礎知識。 MySQL數據庫 MySQL數據庫基礎 MySQL數據庫概念 MySQL 數據庫&#xff1a; 是一個關系型數據庫管理系統 。 支持SQL語…

Qt中的多種輸出方式,信號與槽的基本使用

完成Hello World可以通過很多控件實現 如采用編輯框來完成hello world 編輯框分為單行編輯框----QLineEdit 和多行編輯框---QTextEdit 采用單行編輯框&#xff0c;創建項目后&#xff0c;展開forms文件夾&#xff0c;雙擊ui文件進入 qt designer設計頁面 找到line edit 拖到頁…

英語表達年代和世紀

英語表達年代和世紀 1. Century (世紀)1.1. Start and end of centuries 2. Decade (年代)2.1. Usage 3. 英語表達年代和世紀4. HomeworkReferences XXX0 年代指 XXX0 年 - XXX9 年的連續 10 年&#xff0c;例如 1760 年代指 1760 年至 1769 年這連續 10 年。 XX 世紀 X0 年代…

MySQL數據庫管理5

23.事務 1&#xff09;事務&#xff1a;可以認為是做一件事情 需要多個SQL 要么同時成功 要么同時失敗 需求&#xff1a;銀行轉賬update 你的賬戶 把你的錢減少update 你朋友的賬戶 把他的錢增多?這兩個SQL不能只成功一個 要么都成功 要么都失敗那么 我們就需要用到事務了 它…

閉包和裝飾器

什么是閉包 閉包&#xff08;Closure&#xff09;是 Python 中一個非常重要的概念&#xff0c;它是一種特殊的函數對象&#xff0c;通常用于封裝和延遲計算某些值。以下是閉包的詳細定義和解釋&#xff1a; 1.閉包的定義 閉包是指一個函數對象&#xff0c;它不僅包含函數的代…

notepad++8.6.4安裝及細節

notepad8.6.4下載安裝&#xff08;附安裝包&#xff09; 一、安裝包下載1.1方法一&#xff1a;官網下載&#xff08;點擊跳轉&#xff09;1.2方法二&#xff1a;網盤鏈接分享8.6.4版本 二、安裝過程細節2.1這里的組件建議全部勾選。點擊“下一步”。2.2 勾選①&#xff1a;可以…

COZE通關指南:工作流與插件開發

前言 本文隸屬于專欄《AI Agent 通關指南》,該專欄為筆者原創,引用請注明來源,不足和錯誤之處請在評論區幫忙指出,謝謝! 本專欄目錄結構和參考文獻請見《AI Agent 通關指南》 正文 1. 平臺基礎介紹 ?? 1.1 COZE平臺概述 COZE平臺(coze.cn)是一個強大的AI應用開發平臺…

【Block總結】ENLTransformerBlock,高效非局部變換器塊|即插即用

1. 論文信息 標題: Perspective+ Unet: Enhancing Segmentation with Bi-Path Fusion and Efficient Non-Local Attention for Superior Receptive Fields論文地址: arXiv:2406.14052 2. 創新點 雙路徑編碼策略: 在編碼器階段引入雙路徑策略,結合傳統卷積和空洞卷積的結果,平…

【爬蟲】網易云音樂評論數據爬取

文章目錄 &#x1f356; 前言&#x1f3b6;一、抓取要求?二、代碼展示&#x1f3c0;三、運行結果&#x1f3c6;四、知識點提示 &#x1f356; 前言 【爬蟲】網易云音樂歌詞/評論數據爬取 &#x1f3b6;一、抓取要求 描述: 輸入歌曲的id&#xff0c;獲取對應歌曲的用戶評論信…

C++使用Qt Charts創建數據可視化圖表

Qt Charts 是一個強大的工具&#xff0c;用于創建直觀的數據可視化圖表。本文將通過一個具體的示例&#xff0c;展示如何使用 Qt Charts 創建一個包含多條數據序列、自定義坐標軸和隨機數據生成的圖表。 示例代碼解析 以下是一個完整的示例代碼&#xff0c;展示如何使用 Qt Ch…

TCP/IP五層協議

目錄 1. 五層模型結構 2. 各層核心功能與協議 (1) 應用層&#xff08;Application Layer&#xff09; (2) 傳輸層&#xff08;Transport Layer&#xff09; (3) 網絡層&#xff08;Network Layer&#xff09; (4) 數據鏈路層&#xff08;Data Link Layer&#xff09; (5…

【最新版】金媒婚戀系統v10.5最新穩定開源+原生前端小程序 PC端+安裝教程

一.系統簡介 1. 紅娘服務 紅娘服務模塊是該系統的一大特色。專業紅娘會通過分析用戶的個人資料和偏好&#xff0c; 為用戶提供精準的配對建議和個性化服務。用戶可以預約紅娘服務&#xff0c;通過紅娘的介入&#xff0c;提升配對成功率。 2. 相親活動 相親活動模塊用于組織和管…

吳恩達深度學習復盤(5)神經網絡的前向傳播TesorFlow與NumPy實現比對

數據結構差別 NumPy 和 TensorFlow 在數據表示上的差異展開&#xff0c;結合神經網絡實踐中的常見問題進行說明。以下是詳細解析&#xff1a; 一、簡介 數據表示的歷史背景 NumPy 是 Python 科學計算的基礎庫&#xff0c;早期設計為處理多維數組TensorFlow 由 Google Brain 團…