C++中接口與繼承的區別(自我學習用)

繼承(Inheritance)和 接口(Interface)是面向對象編程(OOP)中的兩種不同概念,雖然在 C++ 中沒有像 Java 那樣的 interface 關鍵字,但可以通過 純虛函數 來實現接口的概念。讓我們詳細比較它們的區別。


1. 繼承(Inheritance)

繼承表示 子類繼承父類的屬性和行為,可以重用和擴展父類的功能。繼承可以是 單繼承多繼承,支持 方法重寫(override)

🌟 示例:繼承

#include <iostream>class Animal {  // 基類(父類)
public:void eat() { std::cout << "動物在吃東西\n"; }
};class Dog : public Animal {  // 子類繼承 Animal
public:void bark() { std::cout << "狗在汪汪叫\n"; }
};int main() {Dog d;d.eat();  // 繼承自 Animald.bark(); // Dog 自己的方法return 0;
}

? 關鍵點

  • 子類自動繼承 父類的 屬性方法
  • 可以添加新功能(如 bark())。
  • 可以重寫父類方法override)。
  • 可能會造成 “過度繼承”,導致代碼耦合性變高。

2. 接口(Interface)

在 C++ 中,沒有 interface 關鍵字,通常用 純虛函數(pure virtual functions) 代表 接口

🌟 接口是一個抽象概念,定義行為而不實現具體邏輯
任何實現這個接口的類都必須提供完整的實現。

🌟 示例:接口

#include <iostream>// 定義接口(純虛類)
class IShape {
public:virtual void draw() = 0;  // 純虛函數,必須由子類實現virtual ~IShape() {}  // 虛析構函數
};// 具體類實現接口
class Circle : public IShape {
public:void draw() override { std::cout << "畫一個圓形\n"; }
};class Rectangle : public IShape {
public:void draw() override { std::cout << "畫一個矩形\n"; }
};int main() {IShape* shape1 = new Circle();shape1->draw();  // 輸出:畫一個圓形IShape* shape2 = new Rectangle();shape2->draw();  // 輸出:畫一個矩形delete shape1;delete shape2;return 0;
}

? 關鍵點

  • IShape 只是一個 接口,不包含具體實現。
  • CircleRectangle 必須實現 draw(),否則不能實例化
  • 強制子類實現接口方法,確保一致的行為

3. 繼承 vs. 接口

特性繼承(Inheritance)接口(Interface)
核心概念子類繼承父類的代碼,實現代碼復用定義行為,但不提供具體實現
可否有實現?? 繼承的方法可以有實現🚫 只能有純虛函數(抽象方法)
可否多重繼承??? 在 C++ 中支持,但可能導致菱形繼承問題? 可以實現多個接口,不會有菱形繼承問題
代碼復用? 可繼承并改寫父類代碼🚫 接口不能提供實現,只能聲明行為
主要用途用于表示**“is-a”(是一個)**關系用于表示**“can-do”(可以做什么)**

4. 繼承和接口結合使用

C++ 支持同時使用繼承和接口,這樣可以 復用代碼保證靈活性

🌟 示例:基類 + 接口

#include <iostream>// 抽象基類(帶部分實現)
class Animal {
public:void eat() { std::cout << "動物在吃東西\n"; }virtual ~Animal() {}
};// 接口(純虛類)
class IRun {
public:virtual void run() = 0;  // 純虛函數virtual ~IRun() {}       // 虛析構
};// 具體類,既繼承 Animal 又實現 IRun 接口
class Dog : public Animal, public IRun {
public:void run() override { std::cout << "狗在奔跑\n"; }void bark() { std::cout << "狗在汪汪叫\n"; }
};int main() {Dog d;d.eat();   // 繼承自 Animald.run();   // 實現接口 IRund.bark();  // Dog 自己的方法return 0;
}

? 解釋:

  • Dog 繼承 Animal,所以它可以 eat()
  • Dog 實現IRun 接口,所以它可以 run()
  • 兼具代碼復用(繼承)和接口的靈活性(組合)。

5. 總結

特點繼承(Inheritance)接口(Interface)
作用代碼復用約束行為
是否可以有默認實現? 可以有部分默認實現🚫 只能聲明方法,不能實現
是否支持多重繼承?? 支持但可能導致菱形繼承? 沒有菱形繼承問題
是否有狀態(成員變量)? 可以有🚫 只能有方法聲明,沒有成員變量
何時使用?- 需要代碼復用時
- 代表 “is-a” 關系(如 DogAnimal
- 需要定義行為約束時
- 代表 “can-do” 關系(如 Dog 可以 run()

? 什么時候用繼承?

  • 當子類完全符合父類的概念時,繼承是一個很好的選擇。例如:
    class Dog : public Animal;  // "Dog is an Animal"
    
  • 適用于代碼復用,但要避免深層次的繼承,否則會造成耦合。

? 什么時候用接口?

  • 當多個類 共享相同行為但無共同實現時,使用接口。例如:
    class ICloneable { virtual void clone() = 0; };
    
  • 適用于多態:不同的類可以有相同行為,但不共享代碼實現。

🌟 結論

? 繼承 = 代碼復用,用于 “is-a”(是一個) 關系
? 接口 = 規定行為,用于 “can-do”(可以做什么) 關系
? 在 C++ 中,可以 結合 繼承和接口(純虛類)使代碼更靈活!🚀🚀


💡 如果你有具體的應用場景或疑問,歡迎繼續交流! 😃

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

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

相關文章

epoll的原理

Epoll是Linux系統中高效的I/O多路復用機制&#xff0c;廣泛應用于高并發服務器&#xff08;如Nginx、Redis&#xff09;。其核心原理在于事件驅動模型和高效數據結構設計&#xff0c;解決了傳統select/poll的性能瓶頸。以下從數據結構、工作流程、觸發模式等維度展開分析&#…

epoll_ctl的概念和使用案例

epoll_ctl 是 Linux 系統中 I/O 多路復用機制 epoll 的核心函數之一&#xff0c;用于管理 epoll 實例監控的文件描述符&#xff08;File Descriptor, FD&#xff09;。它負責向 epoll 實例注冊、修改或刪除需要監控的 FD 及其事件類型&#xff0c;是實現高性能網絡編程&#xf…

Java練習(20)

ps:練習來自力扣 給你一個 非空 整數數組 nums &#xff0c;除了某個元素只出現一次以外&#xff0c;其余每個元素均出現兩次。找出那個只出現了一次的元素。 你必須設計并實現線性時間復雜度的算法來解決此問題&#xff0c;且該算法只使用常量額外空間。 class Solution {pu…

Tetragon:一款基于eBPF的運行時環境安全監控工具

關于Tetragon Tetragon是一款基于eBPF的運行時環境安全監控工具&#xff0c;該工具可以幫助廣大研究人員檢測并應對安全重大事件&#xff0c;例如流程執行事件、系統調用活動、I/O活動&#xff08;包括網絡和文件訪問等&#xff09;。 在 Kubernetes 環境中使用時&#xff0c;…

1046. 最后一塊石頭的重量

文章目錄 1.題目[1046. 最后一塊石頭的重量](https://leetcode.cn/problems/last-stone-weight/description/)2.思路3.代碼 1.題目 1046. 最后一塊石頭的重量 有一堆石頭&#xff0c;每塊石頭的重量都是正整數。 每一回合&#xff0c;從中選出兩塊** 最重的** 石頭&#xff…

Qt多線程技術【線程池】:QRunnable 和 QThreadPool

在現代軟件開發中&#xff0c;尤其是在處理大量并發任務時&#xff0c;線程池技術是一種高效的解決方案。線程池不僅能提高程序的性能&#xff0c;還能有效管理線程的生命周期&#xff0c;避免頻繁的線程創建和銷毀所帶來的性能損失。本文將以Qt中的 QThreadPool 和 QRunnable …

DOM讓JavaScript可以對文檔中的標簽、屬性、內容等進行 訪增刪改 操作

示例 HTML 文檔 首先&#xff0c;我們有一個簡單的 HTML 文件 index.html&#xff0c;內容如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widt…

218.子結構判斷

class Solution {/*** 判斷樹 B 是否是樹 A 的子結構* param A 樹 A 的根節點* param B 樹 B 的根節點* return 如果 B 是 A 的子結構&#xff0c;返回 true&#xff1b;否則返回 false*/public boolean isSubStructure(TreeNode A, TreeNode B) {// 如果樹 B 為空&#xff0c;…

【DuodooBMS】基于Odoo的開源制造執行系統——以開源之力,驅動智能制造

以用戶為中心的開放式智造平臺 DuodooMES的設計始終圍繞“用戶可編程、生態可生長”的核心思想&#xff0c;打破傳統工業軟件的封閉性&#xff0c;讓制造企業真正成為系統的“主人”&#xff1a; 1. 用戶可編程&#xff1a;生產流程由你定義 界面可配置&#xff1a;無需代碼即…

Unity使用iTextSharp導出PDF-02基礎結構及設置中文字體

基礎結構 1.創建一個Document對象 2.使用PdfWriter創建PDF文檔 3.打開文檔 4.添加內容&#xff0c;調用文檔Add方法添加內容時&#xff0c;內容寫入到輸出流中 5.關閉文檔 using UnityEngine; using iTextSharp.text; using System.IO; using iTextSharp.text.pdf; using Sys…

Navicat導入海量Excel數據到數據庫(簡易介紹)

目錄 前言正文 前言 此處主要作為科普帖進行記錄 原先Java處理海量數據的導入時&#xff0c;由于接口超時&#xff0c;數據處理不過來&#xff0c;后續轉為Navicat Navicat 是一款功能強大的數據庫管理工具&#xff0c;支持多種數據庫系統&#xff08;如 MySQL、PostgreSQL、…

文化財經t8優質短線期貨交易量化模型源碼

// 參數設置 BOLL_PERIOD : 20; // 布林帶周期 RSI_PERIOD : 14; // RSI 周期 OVERSOLD : 30; // 超賣線 OVERBOUGHT : 70; // 超買線 // 計算布林帶 MID : MA(CLOSE, BOLL_PERIOD); UPPER : MID 2 * STD(CLOSE, BOLL_PERIOD); LOWER : MID - 2 * STD(CLOSE,…

[AI]Mac本地部署Deepseek R1模型 — — 保姆級教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆級教程 DeepSeek R1是中國AI初創公司深度求索&#xff08;DeepSeek&#xff09;推出大模型DeepSeek-R1。 作為一款開源模型&#xff0c;R1在數學、代碼、自然語言推理等任務上的性能能夠比肩OpenAI o1模型正式版&#xff0c;并采用MI…

【UE5】PeerStream像素流部署

視頻教程 https://www.bilibili.com/video/BV1GhiuecEpK?spm_id_from333.788.videopod.sections&vd_source02dd8acc3a83a728e375ff61f1ebe725步驟 下載PeerStream代碼 代碼結構和項目如圖 github地址:https://github.com/inveta/PeerStreamEnterprise下載node node 對應…

老牌系統工具箱,現在還能打!

今天給大家分享一款超實用的電腦軟硬件檢測工具&#xff0c;雖然它是一款比較“資深”的軟件&#xff0c;但依然非常好用&#xff0c;完全能滿足我們的日常需求。 電腦軟硬件維護檢測工具 功能強大易用 這款軟件非常貼心&#xff0c;完全不需要安裝&#xff0c;直接打開就能用…

java商城解決方案

數字化時代&#xff0c;電子商務已成為企業拓展市場的重要渠道。對于想要建立在線商店的企業來說&#xff0c;選擇正確的技術堆棧至關重要。 Java作為一種成熟且廣泛使用的編程語言&#xff0c;為構建購物中心提供了強大的功能和靈活性。 商城Java源碼&#xff1a;商城開發的核…

軟件的生命周期和需求

什么是軟件的生命周期? 定義(描述) --> 創建 --> 使用 --> 銷毀 (這一整個過程就是事物的生命周期) 生命周期 那么軟件的生命周期又分為哪些呢? 一共分為十步: 可行性研究: 通過分析軟件開發要求,確定軟件項目的性質、目標和規模,得出可行性研究報告,如果可行性研…

QGIS如何下載高程數據

一、準備工作 安裝QGIS軟件 訪問QGIS官網下載最新版本,選擇適合操作系統的安裝包(如Windows 64位)完成安裝。建議使用3.28及以上版本以獲得完整功能支持。 注冊數據平臺賬號 NASA EarthData賬號:訪問EarthData登錄頁面注冊,用于SRTM數據下載。地理空間數據云賬號:訪問www…

【linux學習指南】線程同步與互斥

文章目錄 &#x1f4dd;線程互斥&#x1f320; 庫函數strncpy&#x1f309;進程線程間的互斥相關背景概念&#x1f309;互斥量mutex &#x1f320;線程同步&#x1f309;條件變量&#x1f309;同步概念與競態條件&#x1f309; 條件變量函數 &#x1f6a9;總結 &#x1f4dd;線…

MySQL索引優化,性能飆升的秘密!

0.前言 假設你經營一家電商平臺&#xff0c;某天用戶突然投訴商品搜索加載時間超過10秒。技術團隊緊急排查&#xff0c;發現一條原本執行0.1秒的查詢語句&#xff0c;在百萬級數據量下竟變成了全表掃描。這時&#xff0c;數據庫索引猶如深夜急診室里的救命儀器——它的存在與否…