C++之虛函數 Virtual Function

1. 普通虛函數(Virtual Function)

  • 定義:基類中用 virtual 聲明,允許派生類 覆蓋(Override)
  • 特點
    • 基類可提供默認實現。
    • 派生類可選擇性覆蓋(若不覆蓋,則調用基類版本)。
  • 示例
    class Shape {
    public:virtual void draw() {cout << "Drawing a shape." << endl;}
    };
    

2. 純虛函數(Pure Virtual Function)

  • 定義:基類中用 virtual 聲明并以 = 0 結尾,強制派生類必須實現。

  • 特點:

    • 基類成為 抽象類(Abstract Class),無法實例化。
    • 用于定義接口規范,強制派生類遵守。
  • 示例

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

3. 虛析構函數(Virtual Destructor)

  • 定義:基類的析構函數聲明為 virtual,確保派生類對象通過基類指針刪除時,能正確調用派生類的析構函數。
  • 場景:基類指針指向派生類對象時,必須使用虛析構函數以避免資源泄漏。
  • 現象:先執行派生類析構函數,再執行基類析構函數
#include <iostream>// 基類
class Base {
public:// 虛析構函數virtual ~Base() {std::cout << "Base class destructor" << std::endl;}
};// 派生類
class Derived : public Base {
public:~Derived() override {std::cout << "Derived class destructor" << std::endl;}
};int main() {// 通過基類指針創建派生類對象Base* basePtr = new Derived();// 刪除基類指針delete basePtr;return 0;
}    

4. 關鍵詞 (C++11)

一、override

顯式標記派生類中對基類虛函數的重寫,強制編譯器檢查函數簽名是否完全匹配,避免因拼寫錯誤或參數不匹配導致意外定義新函數

二、final

修飾類:禁止類被繼承(如工具類或不可變類)。
修飾虛函數:禁止派生類進一步重寫該函數(如關鍵算法或接口)。

class Base {
public:virtual void log() final { // 禁止派生類覆蓋cout << "Base log." << endl;}
};
#include <iostream>// 基類
class Base {
public:// 虛函數virtual void print() {std::cout << "This is the Base class." << std::endl;}
};// 派生類
class Derived : public Base {
public:// 重寫基類的虛函數void print()final {std::cout << "This is the Derived class." << std::endl;}
};// 派生類的派生類
/*
class Deriveder : public Derived {
public:// 重寫基類的虛函數void print() override {std::cout << "This is the Deriveder class." << std::endl;}
};
*/// 多態函數
void callPrint(Base* obj) {obj->print();
}int main() {Base base;Derived derived;//Deriveder Deriveder;// 調用多態函數callPrint(&base);callPrint(&derived);//callPrint(&Deriveder);return 0;
}  

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

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

相關文章

基于尚硅谷FreeRTOS視頻筆記——15—系統配制文件說明與數據規范

目錄 配置函數 INCLUDE函數 config函數 數據類型 命名規范 函數與宏 配置函數 官網上可以查找 最核心的就是 config和INCLUDE INCLUDE函數 這些就是裁剪的函數 它們使用一個ifndef。如果定義了&#xff0c;就如果定義了這個宏定義&#xff0c;那么代碼就生效。 通過ifn…

HAL庫配置RS485+DMA+空閑中斷收發數據

前言&#xff1a; &#xff08;1&#xff09;DMA是單片機集成在芯片內部的一個數據搬運工&#xff0c;它可以代替單片機對數據進行傳輸、存儲&#xff0c;節約CPU資源。一般應用場景&#xff0c;ADC多通道采集&#xff0c;串口收發&#xff08;頻繁進入接收中斷&#xff09;&a…

從零開始解剖Spring Boot啟動流程:一個Java小白的奇幻冒險之旅

大家好呀&#xff01;今天我們要一起探索一個神奇的話題——Spring Boot的啟動流程。我知道很多小伙伴一聽到"啟動流程"四個字就開始頭疼&#xff0c;別擔心&#xff01;我會用最通俗易懂的方式&#xff0c;帶你從main()方法開始&#xff0c;一步步揭開Spring Boot的…

下載HBuilder X,使用uniapp編寫微信小程序

到官網下載HBuilder X 地址&#xff1a;HBuilderX-高效極客技巧 下載完成后解壓 打開解壓后的文件夾找到HBuilderX.exe 打開顯示更多&#xff0c;發送到桌面快捷方式 到桌面上啟動HBuilderX.exe啟動應用 在工具點擊插件安裝 選擇安裝Vue3編譯器 點擊新建創建Vue3項目 編寫項目…

詳解與HTTP服務器相關操作

HTTP 服務器是一種遵循超文本傳輸協議&#xff08;HTTP&#xff09;的服務器&#xff0c;用于在網絡上傳輸和處理網頁及其他相關資源。以下是關于它的詳細介紹&#xff1a; 工作原理 HTTP 服務器監聽指定端口&#xff08;通常是 80 端口用于 HTTP&#xff0c;443 端口用于 HT…

2. ubuntu20.04 和VS Code實現 ros的輸出 (C++,Python)

本節對應趙虛左ROS書籍的1.4.2 1)創建工作空間 mkdir -p catkin_ws/src cd catkin_ws catkin_make 2) 終端進入VS Code code . 3) vscoe 的基本配置 3.1&#xff09;修改.vscode/tasks.json ,修改內容如下&#xff1a; { // 有關 tasks.json 格式的文檔&#xff0c;請參見…

SAP系統中MD01與MD02區別

知識點普及&#xff0d;MD01與MD02區別 1、從日常業務中&#xff0c;我們都容易知道MD01是運行全部物料&#xff0c;MD02是運行單個物料 2、在做配置測試中&#xff0c;也出現過MD02可以跑出物料&#xff0c;但是MD01跑不出的情況。 3、MD01與MD02的差異: 3.1、只要在物料主數…

快速迭代收縮-閾值算法(FISTA)

文章目錄 1. 數學與優化基礎2. FISTA 算法的原理、推導與機制3. Matlab 實現4. FISTA 在圖像處理與壓縮感知中的應用4.1. 基于小波稀疏先驗的圖像去噪4.2 壓縮感知圖像重建 1. 數學與優化基礎 在許多信號處理與機器學習問題中&#xff0c;我們希望獲得稀疏解&#xff0c;即解向…

微服務之間打通用戶上下文

微服務之間打通用戶上下文 打通上下文步驟需求&#xff1a;1、gateway網關登錄攔截器&#xff1a;【LoginFilter】解釋&#xff1a;代碼 2、SpringMVC全局處理&#xff1a;【GlobalConfig】解釋&#xff1a;代碼&#xff1a; 3、自定義登錄攔截器&#xff1a;【LoginIntercepto…

Hutool之DateUtil:讓Java日期處理變得更加簡單

前言 在Java開發中&#xff0c;日期和時間的處理是一個常見問題。為了簡化這個過程&#xff0c;許多開發者會使用第三方工具包&#xff0c;如Hutool。Hutool是一個Java工具包&#xff0c;提供了許多實用的功能&#xff0c;其中之一就是日期處理。日期時間工具類是Hutool的核心包…

ES中常用的Query和查詢作用,以及SpringBoot使用實例

ES中常用的Query和查詢作用&#xff0c;以及 SpringBoot 使用實例 文章目錄 ES中常用的Query和查詢作用&#xff0c;以及 SpringBoot 使用實例MatchAllQueryTermQueryBoolQueryRangeQueryMatchQueryMultiMatchQueryTermsQueryPrefixQueryWildcardQueryRegexpQueryFuzzyQueryDis…

Flutter 自定義插件基礎

1、Flutter插件是什么&#xff1f;官方插件庫 在開發Flutter應用過程中會涉及到平臺相關接口調用&#xff0c;例如數據庫操作、相機調用、外部瀏覽器跳轉等業務場景。其實Flutter自身并不支持直接在平臺上實現這些功能&#xff0c;而是通過插件包接口去調用指定平臺API從而實現…

極狐GitLab 外部授權控制機制是怎樣的?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 外部授權控制 (BASIC SELF) 在高度控制的環境中&#xff0c;訪問策略可能需要由外部服務控制&#xff0c;該服務允許基于項目…

Linux系統之----馮諾依曼結構

1.簡要描述 馮諾依曼體系結構是現代計算機的基本設計思想&#xff0c;其核心理念是將計算機的硬件和軟件統一為一個整體&#xff0c;通過存儲程序的方式實現計算。馮諾依曼體系結構的核心思想是通過存儲程序實現自動計算&#xff0c;其五大部件協同工作&#xff0c;奠定了現代…

【八股】計算機網絡

1 概述 1.1 網絡的網絡 網絡把主機連接起來,而互連網(internet)是把多種不同的網絡連接起來,因此互連網是網絡的網絡。而互聯網(Internet)是全球范圍的互連網。 1.2 ISP 互聯網服務提供商 ISP 可以從互聯網管理機構獲得許多 IP 地址,同時擁有通信線路以及路由器等聯…

基于VS Code 為核心平臺的python語言智能體開發平臺搭建

以下是基于 VS Code 為核心平臺&#xff0c;整合 Node-RED、Gradio、Docker Desktop 的智能體可視化開發平臺優化方案&#xff0c;聚焦工具鏈深度集成與開發效率提升&#xff1a; 一、核心架構設計 #mermaid-svg-f8l9kYPAlJ2TlpGF {font-family:"trebuchet ms",verd…

STM32G0單片機自帶RTC

STM32有個自帶RTC外設&#xff0c;外接32.768KHz的晶振后可得到相對精確的計時功能。 實測了一個一小時快個1秒多。 1 cubeMX設置了RTC后自動生成的初始化代碼如下 static void MX_RTC_Init(void) {/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeT…

細說STM32單片機FreeRTOS任務管理API函數及多任務編程的實現方法

目錄 一、FreeRTOS任務管理API函數 1、任務管理API函數 2、獲取任務的句柄 &#xff08;1&#xff09;函數xTaskGetCurrentTaskHandle() &#xff08;2&#xff09;函數xTaskGetIdleTaskHandle() &#xff08;3&#xff09;函數xTaskGetHandle() 3、單個任務的操作 &a…

星露谷物語 7000+ 大型MOD整合包

衣服美化、家具美化、地圖美化、人物肖像美化 全地圖裝修存檔、人物美化、擴展包、環境美化、家具、動植物、通用前置包、新增NPC、功能、服裝發飾妝 帽子發型農場小鎮美化大型玩法拓展實用功能mod 動漫人物形象MOD 地點/動物/地圖/功能/機械/家具/建筑/界面美化/擴展/農場/食譜…

C++ `unique_ptr` 多線程使用

C unique_ptr 多線程使用 一、核心結論 操作同一個 unique_ptr&#xff1a;必須加鎖&#xff08;所有權轉移是非原子操作&#xff09;訪問被管理對象&#xff1a;若對象非線程安全&#xff0c;仍需額外同步獨立 unique_ptr 實例&#xff1a;不同線程操作不同實例時無需加鎖 二…