C++抽象基類定義與使用

在 C++ 中,抽象基類(Abstract Base Class, ABC) 是一種特殊的類,用于定義接口規范和約束派生類的行為。它通過純虛函數(Pure Virtual Function)強制要求派生類實現特定功能,自身不能被實例化。以下是抽象基類的核心概念和使用方法:


1. 定義抽象基類

抽象基類必須包含至少一個 純虛函數,語法為在虛函數聲明后添加 = 0

class Shape {
public:// 純虛函數:沒有實現,必須由派生類覆蓋virtual double area() const = 0;virtual double perimeter() const = 0;// 普通虛函數(可選,可提供默認實現)virtual void printInfo() const {std::cout << "This is a shape." << std::endl;}// 虛析構函數(必須!確保正確釋放資源)virtual ~Shape() = default;
};

2. 抽象基類的特性

  • 不可實例化:抽象基類不能直接創建對象。
    Shape s;  // 錯誤:無法實例化抽象類
    
  • 強制派生類實現接口:派生類必須覆蓋所有純虛函數,否則仍是抽象類。
  • 支持多態:通過基類指針或引用操作派生類對象。

3. 派生類實現示例

class Circle : public Shape {
private:double radius;public:Circle(double r) : radius(r) {}// 必須實現基類的純虛函數double area() const override {return 3.14159 * radius * radius;}double perimeter() const override {return 2 * 3.14159 * radius;}// 可覆蓋基類的普通虛函數(可選)void printInfo() const override {std::cout << "This is a circle." << std::endl;}
};

4. 使用抽象基類實現多態

int main() {Shape* shape = new Circle(5.0);// 調用派生類實現的函數std::cout << "Area: " << shape->area() << std::endl;      // 輸出圓的面積std::cout << "Perimeter: " << shape->perimeter() << std::endl;shape->printInfo();  // 調用派生類的 printInfo()delete shape;return 0;
}

5. 關鍵注意事項

  • 虛析構函數:基類的析構函數必須聲明為虛函數,確保正確釋放派生類資源。
  • 接口規范:抽象基類用于定義通用接口,強制派生類遵守統一行為。
  • 純虛函數的默認實現(C++11 起):
    virtual void someFunction() const = 0 { /* 默認實現 */ }
    
    派生類可通過 BaseClass::someFunction() 調用默認實現。

6. 抽象基類 vs 接口

  • 抽象基類:可以包含數據成員、普通成員函數和純虛函數。
  • 接口(類似 Java):僅包含純虛函數(無數據成員和普通函數),但 C++ 中通過純抽象類模擬:
    class ISerializable {
    public:virtual void serialize() const = 0;virtual void deserialize() = 0;virtual ~ISerializable() = default;
    };
    

總結

抽象基類是 C++ 實現多態和接口規范的核心工具,通過純虛函數強制派生類實現特定功能,確保代碼的一致性和可擴展性。它在設計模式(如工廠模式、策略模式)和大型項目架構中廣泛應用。

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

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

相關文章

用selenium4 webdriver + java 搭建并完成第一個自動化測試腳本

自動化測試任務&#xff1a; 百度搜索自己的姓名。點擊第一個鏈接&#xff08;或者第二個&#xff09;&#xff0c;在新的頁面上&#xff0c;添加斷言&#xff0c;驗證你的名字是否存在。 實驗資料百度網盤下載路徑&#xff1a; 鏈接: https://pan.baidu.com/s/1nVlHX_ivres…

LLM大模型中的基礎數學工具—— 約束優化

Q26: 推導拉格朗日乘子法 的 KKT 條件 拉格朗日乘子法與 KKT 條件是啥&#xff1f; 拉格朗日乘子法是解決約束優化問題的利器。比如&#xff0c;想最小化函數 &#xff0c;同時滿足約束 &#xff0c;就構造拉格朗日函數 &#xff08; 是乘子&#xff09;。KKT 條件是解這類問…

net+MySQL中小民營企業安全生產管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 近些年來&#xff0c;隨著科技的飛速發展&#xff0c;互聯網的普及逐漸延伸到各行各業中&#xff0c;給人們生活帶來了十分的便利&#xff0c;中小民營企業安全生產管理系統利用計算機網絡實現信息化管理&#xff0c;使企業的中小民營企業安全生產管理發展和服務水平有顯…

論文閱讀:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey 生成式人工智能大型語言模型中的人工智能安全性:一項調查 https://arxiv.org/pdf/2407.18369 https://www.doubao.com…

【MySQL數據庫】表的約束

目錄 1&#xff0c;空屬性 2&#xff0c;默認值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主鍵primary key 6&#xff0c;自增長auto_increment 7&#xff0c;唯一鍵unique 8&#xff0c;外鍵foreign key 在MySQL中&#xff0c;表的約束是指用于插入的…

基于javaweb的SpringBoot校園失物招領系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

多模態大語言模型arxiv論文略讀(二十六)

Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ?? 論文標題&#xff1a;Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ?? 論文作者&#xff1a;Xinpeng Ding,…

“星睿O6” AI PC開發套件評測 - 部署PVE搭建All in One NAS服務器

Radxa O6平臺上部署PVE搭建All in One NAS服務器 Radxa O6是一款性能卓越的單板計算機&#xff0c;其強勁的硬件配置和多樣化的接口設計&#xff0c;使其成為家庭和小型企業理想的All in One服務器解決方案。值得一提的是&#xff0c;O6原生配備了兩個5G網口&#xff0c;便于直…

C++ linux打包運行方案(cmake)

文章目錄 背景動態庫打包方案動態庫轉靜態庫動態庫打到軟件包中 運行 背景 使用C編寫的一個小項目&#xff0c;需要打包成ubuntu下的可執行文件&#xff0c;方便分發給其他ubuntu執行&#xff0c;因為docker鏡像方案過于臃腫&#xff0c;所以需要把項目的動態庫都打在軟件包中…

Linux內核編譯(Ubuntu)

實驗內容&#xff1a;在系統中下載統一發行版本的版本號較高的內核&#xff0c;編譯之后運行自己編譯的內核&#xff0c;并使用uname-r命令查看是否運行成功。 實驗步驟&#xff1a; 1.查看實驗環境和內核版本 圖1 實驗環境 VMware中虛擬機Ubuntu&#xff08;24.04&#xff…

EdgeGPT - 新版Bing聊天功能逆向工程

本文翻譯整理自&#xff1a;https://github.com/acheong08/EdgeGPT 文章目錄 一、關于 EdgeGPT相關鏈接資源關鍵功能特性 二、安裝系統要求安裝命令 三、認證配置獲取Cookie步驟代碼中使用Cookie 四、使用方法1、命令行方式2、Python API方式使用Chatbot類使用Query輔助類 3、…

三網通電玩城平臺系統結構與源碼工程詳解(四):子游戲集成與服務器調度機制全解

本篇將深入講解三網通電玩城平臺中子游戲接入、前后端資源組織方式、服務器調度邏輯、并發接入方案等核心內容&#xff0c;重點覆蓋“李逵劈魚”、“水果瑪麗”、“瘋狂瑪麗”等熱門組件&#xff0c;輔以完整代碼框架與部署邏輯。 一、子游戲資源目錄結構與加載機制 平臺采用標…

1.1 AI大模型與Agent的興起及其對企業數字化轉型的推動作用

隨著人工智能技術的飛速發展&#xff0c;AI大模型和智能代理&#xff08;Agent&#xff09;的興起正成為推動企業數字化轉型的重要力量。從2017年GPT-1的首次亮相到2025年GPT-4和Qwen 2.5等多模態模型的成熟&#xff0c;AI大模型經歷了顯著的技術演進&#xff1b;與此同時&…

位運算練習:起床困難綜合征(貪心,位運算)(算法競賽進階指南學習筆記)

目錄 前情提要起床困難綜合征&#xff08;貪心&#xff0c;位運算&#xff09; 前情提要 一些基礎運算操作用法看看上一篇&#xff1b; 起床困難綜合征&#xff08;貪心&#xff0c;位運算&#xff09; 題目原文 [P2114 NOI2014] 起床困難綜合癥 - 洛谷 思路分析 題目很長…

PowerBi中REMOVEFILTERS怎么使用?

在 Power BI 的 DAX 中&#xff0c;REMOVEFILTERS() 是一個非常重要的函數&#xff0c;常用于取消某個字段或表的篩選上下文&#xff08;Filter Context&#xff09;&#xff0c;從而讓你的計算不受切片器&#xff08;Slicer&#xff09;、篩選器或視覺對象的限制。 ? 一、REM…

Vue3 實戰:打造多功能旅游攻略選項卡頁面

在旅游類應用開發中&#xff0c;為用戶提供全面、直觀的信息展示界面至關重要。本文將分享如何基于 Vue3 Axios 技術棧&#xff0c;實現一個包含攻略、游記、問答三大板塊的旅游攻略選項卡頁面&#xff0c;從樣式設計到交互邏輯&#xff0c;帶你深入了解整個開發過程。 項目背…

JavaScript性能優化實戰(1):性能優化基礎與性能分析工具

性能優化的重要性與業務價值 在當今競爭激烈的互聯網環境中,網站和應用的性能已成為用戶體驗和業務成功的關鍵因素。研究表明,頁面加載時間每增加1秒,轉化率可能下降7%,而53%的用戶會在頁面加載時間超過3秒后放棄訪問。這些數據直接揭示了性能優化對業務的巨大影響: 用戶…

Unity 腳本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于訪問被烘培好的 NavMesh. 使用NavMesh類可以執行空間查詢&#xff08;spatial queries&#xff09;&#xff0c;例如路徑查找和可步行性測試。此類還允許您設置特定區域類型的尋路成本&#xff0c;并調整尋路和避免的全局行為。 靜態屬性&#xff0…

Java 靜態內部類面試題與高質量答案合集

本文整理了關于 Java 靜態內部類&#xff08;Static Nested Class&#xff09;在面試中的高頻問題及標準答案&#xff0c;幫助你理解其底層原理、內存表現以及實際應用。 1. 什么是靜態內部類&#xff1f;和普通內部類有什么區別&#xff1f; 答&#xff1a; 靜態內部類是定義…

為什么買不到一定阻抗特性曲線的磁環

為什么買不到一定阻抗特性曲線的磁環&#xff1a; 磁環繞不同的圈數&#xff0c;阻抗特性曲線不同&#xff0c;磁環沒有類似于磁珠的特定頻率和阻抗特性曲線的磁環。 磁環與磁珠的核心區別&#xff1a; 磁珠是一種固定頻率阻抗器件&#xff0c;出廠時已通過材料和工藝設計確定…