C++中的虛函數和純虛函數

目錄

摘要

虛函數(Virtual Functions)

定義

用法

純虛函數(Pure Virtual Functions)

定義

用法

需要避開的坑

總結


摘要

在C++中,我們經常會在開發中使用到虛函數(Virtual Functions)和純虛函數(Pure Virtual Functions),而它們都是面向對象編程的重要概念,它們允許實現多態性,但也有一些我們在實際編程時需要注意的坑。

虛函數(Virtual Functions)

定義

虛函數是在基類中聲明并且使用 `virtual` 關鍵字修飾的成員函數。它可以被派生類重寫,以實現運行時多態性。

class Base {
public:virtual void show() {std::cout << "Base class show function" << std::endl;}
};

用法

1. 基類中聲明虛函數:
? ?在基類中聲明虛函數,以便派生類可以重寫它。

class Base {
public:virtual void show() {std::cout << "Base class show function" << std::endl;}
};

2. 派生類中重寫虛函數:
? ?在派生類中使用相同的函數簽名重寫虛函數。

? ?

class Derived : public Base {
public:void show() override {std::cout << "Derived class show function" << std::endl;}
};

3. 使用基類指針或引用調用虛函數:
? ?通過基類指針或引用調用虛函數時,會根據對象的實際類型調用相應的函數。

void describe(const Base &obj) {obj.show();
}int main() {Base baseObj;Derived derivedObj;describe(baseObj);    // 輸出 "Base class show function"describe(derivedObj); // 輸出 "Derived class show function"return 0;
}

純虛函數(Pure Virtual Functions)

定義

純虛函數是在基類中聲明但沒有實現的虛函數,通過在函數聲明末尾使用 `= 0` 來聲明。

class AbstractBase {
public:virtual void show() = 0; // 純虛函數
};

用法

1. 作為接口:
? ?純虛函數通常用于定義接口,要求派生類必須提供實現。

class AbstractBase {
public:virtual void show() = 0; // 純虛函數,定義接口
};class ConcreteDerived : public AbstractBase {
public:void show() override {std::cout << "ConcreteDerived class show function" << std::endl;}
};

2. 抽象基類:
? ?包含純虛函數的類稱為抽象基類,不能實例化,只能用作派生類的接口。

AbstractBase *ptr = new ConcreteDerived();
ptr->show();  // 輸出 "ConcreteDerived class show function"

需要避開的坑

1. 未實現純虛函數的派生類:
? ?如果派生類沒有實現基類中的所有純虛函數,則該派生類仍然是抽象的,不能實例化。

2. 構造函數中調用虛函數:
? ?在構造函數中調用虛函數,會導致基類的版本被調用,而不是派生類的版本。

3. 析構函數中調用虛函數:
? ?在析構函數中調用虛函數,會導致派生類的版本被調用,但是可能會出現問題,因為在派生類對象的析構函數執行完畢后,其成員變量被銷毀,再調用虛函數就可能會訪問到已銷毀的內存,導致未定義行為。

4. 虛函數的默認參數:
? ?虛函數的默認參數是靜態綁定的,不會根據運行時對象的實際類型而改變。

5. 虛函數與模板:
? ?在模板類中使用虛函數可能會導致編譯器難以生成有效的代碼,因為模板的特化版本可能會對虛函數的實現產生影響。

#include <iostream>class AbstractBase {
public:virtual void show() = 0; // 純虛函數virtual ~AbstractBase() {}
};class ConcreteDerived : public AbstractBase {
public:void show() override {std::cout << "ConcreteDerived class show function" << std::endl;}~ConcreteDerived() {std::cout << "ConcreteDerived destructor" << std::endl;}
};int main() {// AbstractBase *ptr = new AbstractBase(); // 錯誤:不能實例化抽象類AbstractBase *ptr = new ConcreteDerived();ptr->show(); // 輸出 "ConcreteDerived class show function"delete ptr;  // 輸出 "ConcreteDerived destructor"return 0;
}

總結

1. 虛函數:
? - 使用 `virtual` 關鍵字聲明,允許在派生類中重寫。
? - 允許通過基類指針或引用調用派生類的方法。

2. 純虛函數:
? - 使用 `virtual` 關鍵字聲明并在末尾添加 `= 0`,作為接口的一部分。
? - 不能實例化,只能作為派生類的接口,派生類必須實現所有純虛函數。

虛函數和純虛函數在實際應用中廣泛使用,且很多功能的繼承和多態也離不開虛函數。需要我們注意到的是虛函數留下的坑,不然問題真的很難被發現。

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

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

相關文章

如何有效屏蔽手機上的騷擾電話20240530

如何有效屏蔽手機上的騷擾電話 引言 最近&#xff0c;我的手機經常接到954開頭的7位數字座機電話&#xff0c;這些騷擾電話讓我非常困擾。由于我經常點外賣&#xff0c;無法屏蔽所有陌生號碼&#xff0c;因此需要一個既能屏蔽特定前綴的騷擾電話&#xff0c;又不影響日常生活…

英偉達(NVIDIA)H100性能及應用場景

英偉達H100是一款性能強大的GPU芯片&#xff0c;其關鍵性能參數和應用領域可以歸納如下&#xff1a; 一、性能參數 架構&#xff1a;H100采用了新一代的Hopper架構&#xff0c;擁有高達1.8萬億次/秒的張量處理能力和高達840 TFLOPS的FP8張量性能。CUDA核心數&#xff1a;H100…

STM32學習和實踐筆記(33):待機喚醒實驗

1.STM32待機模式介紹 很多單片機具有低功耗模式&#xff0c;比如MSP430、STM8L等&#xff0c;我們的STM32也不例外。默認情況下&#xff0c;系統復位或上電復位后&#xff0c;微控制器進入運行模式。在運行模式下&#xff0c;HCLK 為CPU提供時鐘&#xff0c;并執行程序代碼。這…

kafka學習筆記06

Kafka數據存儲流程和log日志講解 講解分布式應用核心CAP知識 Kafka數據可靠性保證原理之副本機制Replica介紹《上》 Kafka數據可靠性保證原理之副本機制Replica介紹《下》 Kafka數據可靠性保證原理之ISR機制講解 Kafka的HighWatermark的作用你知道多少

暑期來臨,AI智能視頻分析方案筑牢防溺水安全屏障

隨著夏季暑期的來臨&#xff0c;未成年人溺水事故頻發。傳統的防溺水方式往往依賴于人工巡邏和警示標識的設置&#xff0c;但這種方式存在人力不足、反應速度慢等局限性。近年來&#xff0c;隨著視頻監控智能分析技術的不斷發展&#xff0c;其在夏季防溺水中的應用也日益凸顯出…

ubuntu22 搭建nginx高可用集群(VIP(keepalived) + 負載均衡)

#在所有節點安裝nginx #ps: 如果要使用tcp流轉發&#xff1a;需用二進制包安裝 make編譯時加入stream流的參數。 推薦直接安裝openresty【默認支持stream等nginx模塊&#xff0c;還附帶了很多常用的lua庫】 apt install -y net-tools sudo apt install -y nginx vim /etc/…

恒創科技:無法與服務器建立安全連接怎么解決?

在使用互聯網服務時&#xff0c;有時會出現無法與服務器建立安全連接的問題&#xff0c;此錯誤消息通常出現在嘗試訪問需要安全連接的網站(例如使用 HTTPS 的網站)時&#xff0c;這可能是由于多種原因造成的&#xff0c;以下是一些常見的解決方法&#xff0c;幫助你解決問題。 …

聚道云軟件連接器:打通易快報與保融資金系統,實現高效財務管理

一、客戶介紹&#xff1a;食品企業&#xff0c;引領健康零食新風尚 某食品行業的公司作為國內領先的集研發、生產、銷售為一體的現代化辣味休閑食品企業。該公司秉承“健康、美味、安全”的理念&#xff0c;不斷創新和進取&#xff0c;為消費者帶來了一系列美味可口的辣味休閑…

msvcp100.dll丟失怎樣修復?幾種快速有效修復msvcp100.dll丟失的方法

在使用電腦時是不是遇到過關于msvcp100.dll丟失文件丟失的情況&#xff1f;出現這樣的情況有什么辦法可以將丟失的msvcp100.dll文件快速恢復&#xff1f;今天的這篇文章就將教大家幾種能夠有效的解決msvcp100.dll丟失問題的方法。 方法一&#xff1a;重啟電腦 重啟電腦是一種簡…

參數高效微調PEFT(三)快速入門LoRA、AdaLoRA

參數高效微調PEFT(三)快速入門LoRA、AdaLoRA 我們已經了解了HuggingFace中peft庫的幾種高效微調方法。 參數高效微調PEFT(一)快速入門BitFit、Prompt Tuning、Prefix Tuning 參數高效微調PEFT(二)快速入門P-Tuning、P-Tuning V2 今天我們繼續了解大火的高效微調方法LoRA以及…

MyBatis基礎理解教程,詳細分步基礎查詢表數據練習(通俗易懂、實時更新)

一、MyBatis是什么 MyBatis 是一個持久層框架&#xff0c;簡化JDBC開發&#xff0c;它提供了一個從 Java 應用程序到 SQL 數據庫的橋梁&#xff0c;用于數據的存儲、檢索和映射。MyBatis 支持基本的 SQL 操作、高級映射特性以及與 Maven 等構建工具的集成。 二、持久層是什么…

IDEA增加.gitignore文件后的處理

IDEA增加 .gitignore 文件后&#xff0c;但還是被 git 跟蹤了。 我的文件已經被添加到 .gitignore 中&#xff0c;但仍然被 Git 跟蹤&#xff0c; 文件被修改后commint中就會存在此文件。 原因: 文件已經被提交過了 如果文件在添加到 .gitignore 之前已經被提交到 Git 倉庫中,…

Spring boot集成通義千問大模型

Spring boot集成通義千問大模型 背景 我在用idea進行java開發時發現了通義靈碼這款免費的智能代碼補全插件&#xff0c;用了一段時間了&#xff0c;感覺很不錯。就想著在自己的項目中也能集成通義千問大模型實現智能回答&#xff0c;畢竟對接openai需要解決網絡問題&#xff…

戰略合作 | 竹云賦能雁塔區數字經濟高質量發展

2024年5月30日&#xff0c;由西安市數據局指導&#xff0c;中共西安市雁塔區委、西安市雁塔區人民政府主辦的 “雁塔區企業數字化轉型發展大會” 在西安開幕。 本次活動以“數智雁塔&#xff0c;引領未來”為主題&#xff0c;特邀業內150余位政府、數字化服務企業、傳統行業企…

Kubernetes 之 DaemonSet 基本原理

Kubernetes 之 DaemonSet 基本原理 DaemonSet 定義 DaemonSet 確保全部&#xff08;或者某些&#xff09;節點上運行一個 Pod 的副本。 當有節點加入集群時&#xff0c; 也會為他們新增一個 Pod 。 當有節點從集群移除時&#xff0c;這些 Pod 也會被回收。刪除 DaemonSet 將會…

先導微型數控桌面式加工中心

隨著數控技術、傳感器技術、人工智能等技術的不斷發展&#xff0c;制造業的快速發展和技術的不斷進步&#xff0c;小型五軸加工中心的性能將不斷提升&#xff0c;五軸聯動技術作為解決異性復雜零件高效優質加工問題的重要手段&#xff0c;使其具有更廣泛的應用前景。小型五軸加…

【啟明智顯分享】國產自主ZX7981P Wi-Fi6 5G-CPE開發板有哪些優勢?

在當前競爭激烈的智能設備市場中&#xff0c;高性能與低功耗的開發板已然成為各大產品追求的關鍵優勢。 今天我們從國產自主研發的ZX7981P Wi-Fi6 5G-CPE開發板的特點出發&#xff0c;分析他是否滿足市場追求的特點。 主要特點&#xff1a; 1. 強大配置&#xff0c;穩定可靠 …

5.30 學習總

刷題記錄(Codeforces Round 947 &#xff08;Div. 1 Div. 2&#xff09;B,C題)和Codeforces Round 948 &#xff08;Div. 2&#xff09;B題 一.B. 378QAQ and Mochas Array B. 378QAQ and Mochas Array time limit per test 1 second memory limit per test 256 megabytes in…

長難句5.30

Researchers measured people’s cortisol, which is a stress marker, while they were at work and while they were at home and found it higher at what is supposed to be a place of refuge. 研究人員測量了人們在工作中和在家里的皮質醇(壓力的一種標志)&#xff0c;結…

在 JavaScript 中循環遍歷數組的多種方法

在JavaScript編程中,遍歷數組是一個非常常見的操作。根據不同的需求和JavaScript的不同版本,我們有多種方法來完成這一操作。本文將介紹幾種有效的方法,包括現代的和傳統的方式,同時分析每一種方法的優缺點。 1. 使用 for...of 語法 for...of 是在 ECMAScript 2015(ES6)…