C++ 面向對象特性詳解:繼承機制

🚀 C++ 面向對象特性詳解:繼承機制全解析——代碼復用與擴展的核心(含實戰陷阱)
📅 更新時間:2025年6月19日
🏷? 標簽:C++ | 繼承 | OOP | 面向對象 | 代碼復用 | C++基礎

文章目錄

  • 📖 前言
  • 🔍 一、基礎概念:C++繼承
    • 1. 什么是繼承
    • 2. 繼承的語法
    • 3. 繼承的作用
    • 4. 繼承的類型
  • 📝 二、語法詳解:繼承的實現
    • 1. 公有繼承(public)
    • 2. 保護繼承(protected)
    • 3. 私有繼承(private)
    • 4. 繼承方式對成員訪問的影響
  • ?? 三、常見陷阱
    • 陷阱1:父類的private成員不能被子類直接訪問
  • 🎯 四、實戰案例
    • 1. 繼承實現代碼復用
    • 5. 繼承方式訪問權限總結表
  • 📊 五、總結

📖 前言

C++和面向對象編程(OOP) 中,繼承是實現代碼復用和擴展的核心機制。通過繼承,子類可以直接擁有父類的屬性和方法,大大減少了重復代碼,并為多態等高級特性打下了基礎。理解繼承不僅有助于寫出結構清晰、易維護的程序,也是掌握OOP思想的關鍵一步

🔍 一、基礎概念:C++繼承

1. 什么是繼承

繼承是面向對象編程(OOP)中的核心特性之一。它允許一個類(子類/派生類)自動獲得另一個類(父類/基類)的屬性和方法,從而實現代碼復用和功能擴展<.font>

2. 繼承的語法

class 父類名 {// 父類成員
};class 子類名 : 繼承方式 父類名 {// 子類成員
};

常見的繼承方式有:publicprotectedprivate

3. 繼承的作用

  • 代碼復用,提高開發效率
  • 實現類之間的層次結構
  • 多態打下基礎

4. 繼承的類型

  • 公有繼承(public):最常用,父類的公有成員和保護成員在子類中保持原有訪問權限,子類只能訪問父類的public下的成員以及函數
  • 保護繼承(protected):父類的公有和保護成員在子類中都變為保護成員
  • 私有繼承(private):父類的公有和保護成員在子類中都變為私有成員

📝 二、語法詳解:繼承的實現

1. 公有繼承(public)

公有繼承是最常用的繼承方式,表示"is-a"關系。子類對象可以直接訪問父類的public成員,父類的protected成員在子類內部可以訪問,但在外部不可見

示例:

class Animal {
public:void speak() { cout << "Animal speaks" << endl; }
protected:void eat() { cout << "Animal eats" << endl; }
};class Dog : public Animal {
public:void bark() { cout << "Dog barks" << endl; }void test() {speak(); // 可以訪問父類public成員eat();   // 可以內部訪問父類protected成員}
};int main() {Dog d;d.speak(); // 正確,public成員d.bark();  // 正確,Dog自己的方法// d.eat(); // 錯誤,protected成員不能在外部訪問d.test();  // 正確,通過子類成員函數間接訪問protected成員return 0;
}
輸出:
Animal speaks
Dog barks
Animal speaks
Animal eats

公有繼承下,子類對象可以直接訪問父類的public成員,protected成員只能在子類內部訪問


2. 保護繼承(protected)

保護繼承表示"實現繼承",不希望外部把子類當作父類用。父類的public和protected成員在子類中都變成protected,外部無法訪問,但子類內部可以訪問

示例:

class Base {
public:int a;
protected:int b;
};class Derived : protected Base {
public:void show() {a = 10; // 可以內部訪問,a在Derived中是protectedb = 20; // 可以內部訪問,b在Derived中是protectedcout << "a = " << a << ", b = " << b << endl;}
};int main() {Derived d;// d.a = 1; // 錯誤,a在Derived中是protected 無法外部訪問// d.b = 2; // 錯誤,b在Derived中是protected 無法外部訪問d.show(); // 正確,通過成員函數間接訪問return 0;
}輸出:
a = 10, b = 20

保護繼承下,父類的public和protected成員在子類中都變成protected,只能在子類及其后代內部c訪問


3. 私有繼承(private)

私有繼承表示"實現繼承",但對子類和外部都隱藏父類接口。父類的public和protected成員在子類中都變成private,只能在子類內部訪問,外部和子類的子類都無法訪問

示例:

class Base {
public:int a;
protected:int b;
};class Derived : private Base {
public:void show() {a = 10; // 可以內部訪問,a在Derived中是privateb = 20; // 可以內部訪問,b在Derived中是privatecout << "a = " << a << ", b = " << b << endl;}
};class SubDerived : public Derived {
public:void test() {// a = 1; // 錯誤,a在Derived中是private,SubDerived無法訪問// b = 2; // 錯誤,b在Derived中是private,SubDerived無法訪問}
};int main() {Derived d;// d.a = 1; // 錯誤,a在Derived中是private 無法外部訪問// d.b = 2; // 錯誤,b在Derived中是private 無法外部訪問d.show(); // 正確,通過成員函數間接訪問return 0;
}

私有繼承下,父類的public和protected成員在子類中都變成private,只能在子類內部訪問,子類的子類和外部都無法訪問

就算子類的子類用私有繼承,內部依然無法訪問!!!!!!!!

class SubDerived : private Derived {
public:void test() {// a = 1; // 錯誤,子類的子類在內部也依然無法訪問// b = 2; // 錯誤,}
};

4. 繼承方式對成員訪問的影響

繼承方式父類public成員父類protected成員父類private成員
publicpublicprotected不可訪問
protectedprotectedprotected不可訪問
privateprivateprivate不可訪問

無論哪種繼承方式,父類的private成員都無法被子類訪問


?? 三、常見陷阱

陷阱1:父類的private成員不能被子類直接訪問

? 錯誤示例:

class Base {
private:int x;
};
class Derived : public Base {
public:void foo() { x = 10; } // 錯誤,x是private   即使是在內部訪問也不行
};

? 正確示例:

class Base {
protected:int x;
};
class Derived : public Base {
public:void foo() { x = 10; } // 正確,x是protected  可以內部訪問  但不能外部訪問
};

private成員只能被本類訪問,不能被子類直接訪問


🎯 四、實戰案例

1. 繼承實現代碼復用

class Shape {
public:void draw() { cout << "Drawing shape" << endl; }
};class Circle : public Shape {
public:void drawCircle() { cout << "Drawing circle" << endl; }
};int main() {Circle c;c.draw();       // 復用Shape的draw方法c.drawCircle(); // Circle自己的方法return 0;
}

繼承讓子類自動擁有父類的功能,減少重復代碼

5. 繼承方式訪問權限總結表

繼承方式訪問位置可訪問自身成員可訪問父類成員(在子類中的權限)
public外部publicpublic
子類內部public, protected, privatepublic, protected
protected外部public無(父類成員都變成protected,外部不可訪問)
子類內部public, protected, privateprotected(原public、protected)
private外部public無(父類成員都變成private,外部不可訪問)
子類內部public, protected, privateprivate(原public、protected)

說明:

  • "自身成員"指子類自己聲明的成員。
  • "父類成員"指通過繼承獲得的父類成員。
  • "在子類中的權限"指父類成員在子類中的訪問級別。
  • "無"表示外部無法訪問父類成員。

📊 五、總結

  • 繼承是OOP三大特性之一**,實現了代碼復用和擴展**
  • 公有繼承最常用,注意訪問權限的變化
  • 父類的private成員不能被子類直接訪問
  • 繼承為多態提供了基礎

如果您覺得這篇文章對您有幫助,不妨點贊 + 收藏 + 關注,更多 C++ 系列教程將持續更新 🔥!

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

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

相關文章

學習日記-day33-6.19

知識點&#xff1a; 1.Spring課程概述 知識點 核心內容 重點 Spring框架概述 輕量級容器框架&#xff0c;封裝復雜邏輯&#xff0c;需理解IOC、AOP等核心機制 容器框架 vs 普通框架、封裝帶來的理解門檻 學習難點 動態代理、反射、注解、IO操作、XML解析、容器&#xf…

網絡編程中操作系統連接隊列管理:Linux TCP隊列深度解析

在現代網絡編程中&#xff0c;操作系統內核扮演著至關重要的角色&#xff0c;負責管理網絡通信的復雜細節&#xff0c;從而為應用程序提供抽象接口。對于服務器應用程序而言&#xff0c;高效處理大量傳入連接請求是確保性能和可靠性的核心。操作系統通過維護專門的隊列機制來管…

StableDiffusion實戰-手機壁紙制作 第一篇:從零基礎到生成藝術品的第一步!

大家好!歡迎來到《StableDiffusion實戰-手機壁紙制作》系列的第一篇! 在這一篇文章里,我們將一起探索如何用StableDiffusion(SD)這款強大的工具,快速制作出炫酷的手機壁紙。 如果你對生成藝術、AI繪圖感興趣,那你一定不能錯過! 你能做什么?你將做什么! 在之前的系…

運維——14.PowerShell 與Linux 、 macOS通用的命令

PowerShell 最初是 Windows 平臺的&#xff0c;但現在已經有了 PowerShell Core&#xff0c;它是跨平臺的&#xff0c;支持 Linux 和 macOS。在 PowerShell Core 中有一些Linux 和 macOS通用的命令。理清楚這些有助于學習多系統命令。 在 Linux/macOS 上使用 PowerShell 完成文…

C#的泛型和匿名類型

一、C#的泛型簡介 泛型是一種允許你延遲編寫類或方法中的數據類型規范&#xff0c;直到你在實際使用時才替換為具體的數據類型【簡單的說&#xff1a;泛型就是允許我們編寫能夠適用于任何數據類型的代碼&#xff0c;而無需為每種特定類型重寫相同的代碼】(T是類型參數&#xff…

日語面試ai助手推薦:高效備考并應對日語面試難題

在準備日語面試的路上&#xff0c;你是否時常感到力不從心&#xff1f;每到模擬面試環節&#xff0c;總怕自己答非所問、用語不地道&#xff0c;或是緊張到腦子一片空白。查找資料時&#xff0c;面對海量的日語問答、面試范本和專業術語&#xff0c;常常分不清輕重緩急&#xf…

【63 Pandas+Pyecharts | 泡泡瑪特微博熱搜評論數據分析可視化】

文章目錄 &#x1f3f3;??&#x1f308; 1. 導入模塊&#x1f3f3;??&#x1f308; 2. Pandas數據處理2.1 讀取數據2.2 數據信息2.3 數據去重2.4 數據去空2.5 時間處理2.6 性別處理2.7 評論內容處理 &#x1f3f3;??&#x1f308; 3. Pyecharts數據可視化3.1 用戶評論IP分…

python-最長無重復子數組

最長無重復子數組 描述代碼實現 描述 給定一個長度為n的數組arr&#xff0c;返回arr的最長無重復元素子數組的長度&#xff0c;無重復指的是所有數字都不相同。 子數組是連續的&#xff0c;比如[1,3,5,7,9]的子數組有[1,3]&#xff0c;[3,5,7]等等&#xff0c;但是[1,3,7]不是…

探索 MySQL 緩存機制:提升數據庫讀取性能的有效策略

在現代應用中,數據庫的讀取性能是影響用戶體驗和系統響應速度的關鍵因素。當應用程序面臨高并發讀請求時,直接訪問磁盤的開銷會成為瓶頸。為了應對這一挑戰,MySQL 引入了多種緩存機制,旨在減少磁盤 I/O,加快數據檢索速度。 理解并合理利用這些緩存機制,是提升 MySQL 數據…

深度學習-164-MCP技術之開發本地MCP服務器和異步客戶端

文章目錄 1 概念1.1 MCP1.2 準備數據接口2 開發MCP服務器2.1 server.py2.1.1 @mcp.resource2.1.2 @mcp.tool()2.1.3 @mcp.prompt()2.2 調試模式啟動mcp-server2.2.1 資源2.2.2 工具2.2.3 提示詞3 開發MCP客戶端3.1 調用工具client_tool3.2 獲取提示client_prompt3.3 讀取資源cl…

第八十一篇 大數據開發基礎:隊列數據結構詳解與實戰應用(附生活化案例)

在大數據開發的龐大體系中&#xff0c;隊列&#xff08;Queue&#xff09; 作為基礎數據結構之一&#xff0c;其重要性不言而喻。它不僅是構建高效數據管道的核心組件&#xff0c;更是實現異步處理、流量削峰、任務調度的關鍵技術。本文將深入解析隊列的原理&#xff0c;結合生…

linux操作命令(最常用)

一、文件與目錄操作 命令作用常用參數示例ls列出目錄內容ls -l&#xff08;詳細列表&#xff09; ls -a&#xff08;顯示隱藏文件&#xff09;cd切換目錄cd ~&#xff08;回家目錄&#xff09; cd ..&#xff08;返回上級&#xff09;pwd顯示當前路徑-cp復制文件/目錄cp -r di…

22.react和next.js、SSR與CSR的比較

SSR 和 CSR 的區別 &#x1f538; 示例說明 SSR 流程&#xff08;Next.js 支持&#xff09;&#xff1a; 1. 用戶請求頁面 2. 服務端生成 HTML&#xff08;含內容&#xff09; 3. 瀏覽器收到渲染好的頁面 // SSR 頁面&#xff08;默認行為&#xff09; - app/page.tsx export…

全棧加速:FrankenPHP 架構原理與實戰案例

在當今云原生與微服務大行其道的時代&#xff0c;PHP 應用面臨著「冷啟動延遲高」「進程管理復雜」「性能瓶頸難以突破」等痛點。 FrankenPHP 正是為了解決這些問題而生&#xff1a;它將 Caddy 服務器與 PHP 運行時深度融合&#xff0c;內嵌 Let’s Encrypt 自動 HTTPS、支持 …

Android開發中的適配

目錄 一:分辨率適配 1.1概念 1.2關鍵策略 二:多尺寸適配 2.1概念 2.2關鍵策略 三:多平臺多版本適配 3.1Android系統版本迭代 3.2 關鍵策略 Android開發中的屏幕適配與多版本適配 在Android開發中,屏幕適配和多版本適配是確保應用在各種設備上都能良好運行和顯示的關鍵。這不…

【MySQL基礎篇】MySQL中的算術運算符和比較運算符

精選專欄鏈接 &#x1f517; MySQL技術筆記專欄Redis技術筆記專欄大模型搭建專欄Python學習筆記專欄深度學習算法專欄 歡迎訂閱&#xff0c;點贊&#xff0b;關注&#xff0c;每日精進1%&#xff0c;共攀技術高峰 更多內容持續更新中&#xff01;希望能給大家帶來幫助~ &…

FFmpeg推流實戰30秒速成

FFmpeg windows 7.1.1下載地址 FFmpeg 推流方法 FFmpeg 是一個強大的多媒體處理工具&#xff0c;支持將視頻和音頻推流到各種流媒體服務器&#xff08;如 RTMP、RTSP、HLS 等&#xff09;。以下是幾種常見的推流方法。 推流到 RTMP 服務器 RTMP&#xff08;Real-Time Messa…

74HC595功能介紹及代碼驅動

一、引腳描述 QA~QH(15,1~7腳):數據輸出引腳 QH1(9腳):移位寄存器串行數據輸出腳,當移位寄存器中的數據多余8位時,最先進入的那位被擠出去,一般級聯使用,接下一個74HC595 G(13腳):輸出使能引腳,低電平使能 RCK(12腳):存儲寄存器輸入數據使能引腳,上升沿時…

AntV G 入門教程

下面是 AntV?G&#xff08;以下簡稱 G&#xff09;的中文入門與核心 API 教程&#xff0c;涵蓋從畫布創建、圖形繪制到事件與動畫等常用方法&#xff0c;每個 API 均附帶完整示例代碼。示例引用自官方“Getting Started”指南 ([g.antv.antgroup.com][1])。 一、安裝與引入 #…

短視頻矩陣什么意思?

短視頻矩陣是指通過布局多個短視頻賬號&#xff0c;形成協同運營的賬號體系&#xff0c;以實現流量聚合、品牌曝光或商業變現的策略。其核心邏輯是利用不同賬號的定位、內容風格或受眾群體&#xff0c;構建互補的流量網絡&#xff0c;而非單一賬號的獨立運營。 核心特點與作用&…