博客標題:C++中的繼承:構建面向對象的基石

目錄

?編輯

引言

繼承的基本形式

示例1:基本繼承

繼承的類型

示例2:不同類型的繼承

多重繼承

示例3:多重繼承

繼承與多態性

示例4:繼承與多態

結論

結尾


引言

在面向對象編程(OOP)中,繼承是一個核心概念,它允許創建新的類,這些新類可以從現有類那里繼承屬性和行為。在C++中,繼承被廣泛用于代碼復用、模塊化以及實現多態性。本文將深入探討C++中繼承的特性和優勢,通過多個代碼示例來闡述其應用和注意事項。

繼承的基本形式

繼承允許一個類(子類或派生類)從另一個類(父類或基類)那里獲取屬性和方法。這樣可以減少重復代碼,同時保持代碼的清晰性和可維護性。

示例1:基本繼承
#include <iostream>class Animal {
public:void speak() const {std::cout << "Some sound" << std::endl;}
};class Dog : public Animal {
public:void speak() const override {std::cout << "Woof!" << std::endl;}
};int main() {Dog myDog;myDog.speak(); // 輸出: Woof!return 0;
}

在這個例子中,Dog類從Animal類繼承了speak方法,并進行了覆蓋,使其輸出更具體的聲音。

繼承的類型

C++支持多種繼承類型,包括公有繼承(public)、保護繼承(protected)和私有繼承(private)。每種繼承類型控制著基類成員對派生類及派生類之外的可訪問性。

示例2:不同類型的繼承
#include <iostream>class Base {
protected:int protectedData;
private:int privateData;
};class PublicDerived : public Base {
public:PublicDerived() { protectedData = 10; } // 可以訪問protectedData
};class PrivateDerived : private Base {
public:PrivateDerived() { protectedData = 20; } // 編譯錯誤,不能直接訪問protectedData
};int main() {PublicDerived pd;// pd.protectedData; // 編譯錯誤,在類外不可訪問PrivateDerived pd2;// pd2.protectedData; // 編譯錯誤,即使在派生類內也不能直接訪問return 0;
}
多重繼承

C++還支持多重繼承,即一個類可以繼承多個基類。這在某些情況下非常有用,但也會導致復雜性增加,例如鉆石問題(diamond problem)。

示例3:多重繼承
#include <iostream>class InterfaceA {
public:virtual void methodA() const = 0;
};class InterfaceB {
public:virtual void methodB() const = 0;
};class Concrete : public InterfaceA, public InterfaceB {
public:void methodA() const override {std::cout << "Method A called." << std::endl;}void methodB() const override {std::cout << "Method B called." << std::endl;}
};int main() {Concrete obj;obj.methodA();obj.methodB();return 0;
}
繼承與多態性

繼承與虛函數結合可以實現多態性,允許使用基類指針或引用調用派生類的方法,這增強了程序的靈活性和可擴展性。

示例4:繼承與多態
#include <iostream>class Shape {
public:virtual void draw() const {std::cout << "Drawing shape..." << std::endl;}
};class Circle : public Shape {
public:void draw() const override {std::cout << "Drawing circle..." << std::endl;}
};class Square : public Shape {
public:void draw() const override {std::cout << "Drawing square..." << std::endl;}
};int main() {Shape* shapes[] = {new Circle(), new Square()};for (auto shape : shapes) {shape->draw();}for (auto shape : shapes) {delete shape;}return 0;
}
結論

繼承是C++中一個強大而靈活的概念,它能夠促進代碼的復用和模塊化,同時也是實現多態性的關鍵。然而,不當的使用也可能導致代碼復雜度上升和潛在的問題。理解繼承的細節和限制,能夠幫助開發者更加有效地利用這一特性,構建出既強大又健壯的軟件系統。

結尾

通過本文的討論和示例,我們不僅了解了C++中繼承的基礎知識,還探索了其不同形式和與多態性的緊密聯系。繼承是構建面向對象設計的基石之一,掌握其精髓將使你成為更優秀的C++程序員。下次當你設計類結構時,不妨考慮一下如何巧妙地運用繼承來增強代碼的可讀性和可維護性。

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

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

相關文章

【持續集成_03課_Linux部署Sonar+Gogs+Jenkins】

一、通過虛擬機搭建Linux環境-CnetOS 1、安裝virtualbox&#xff0c;和Vmware是一樣的&#xff0c;只是box更輕量級 1&#xff09;需要注意內存選擇&#xff0c;4G 2、啟動完成后&#xff0c;需要獲取服務器IP地址 命令 ip add 服務器IP地址 通過本地的工具&#xff0c;進…

新手教學系列——crontab 使用不當引發的服務器性能問題

起因及癥狀 最近,我們的一臺服務器隨著運行時間的增加,逐漸出現了壓力過大的問題。具體表現為數據庫連接數飆升至 4000+,Redis 頻繁超時,系統報錯文件打開數過多等。針對這些問題,我們逐一檢查了數據庫連接池、Redis 連接池以及系統的 ulimit 配置,但都未能找到問題的根…

第241題| 確定極限中參數問題 | 武忠祥老師每日一題

解題思路&#xff1a;確定極限中的參數的方法是求這個極限&#xff1b;求極限根據類型選方法。 形可以用到三種方法&#xff1a;洛必達&#xff0c;等價&#xff0c;泰勒。 先觀察題目&#xff0c;將看成一個整體&#xff0c;同時,并令,整理之后如下&#xff1a; 這里也要想辦…

mysql怎么調整緩沖區大小

MySQL中調整緩沖區大小是數據庫性能優化的重要一環。緩沖區大小直接影響了數據庫的讀寫性能和響應速度。以下是一些常見的MySQL緩沖區及其調整方法&#xff1a; 一、InnoDB緩沖池&#xff08;InnoDB Buffer Pool&#xff09; InnoDB緩沖池是InnoDB存儲引擎用來緩存表數據和索…

代碼隨想錄第7天 454 、 383 、15、18

代碼隨想錄第7天 454. 四數相加 II 思路就是先統計nums1和num2各個元素之和出現的次數&#xff0c;然后遍歷num3和nums4各個元素之和&#xff0c;看其相反數是否在map中&#xff0c;若在加上出現次數 class Solution { public: int fourSumCount(vector<int> &num…

nginx.conf配置文件

1、全局模塊 worker_processes 1; 工作進程數&#xff0c;一般設置成服務器內核數的2倍&#xff08;一般不超過8個&#xff0c;超過8個反而會降低性能&#xff0c;一般是4個&#xff0c;1-2個也可以&#xff09; 處理進程的過程必然涉及配置文件和展示頁面&#xff0c;也就是…

高斯過程的定義

高斯過程 1. 高斯過程的定義2. 協方差矩陣的構建3. 協方差矩陣的性質3.1. 計算挑戰3.2. 解決方法 1. 高斯過程的定義 高斯過程可以看作是對函數的分布&#xff0c;它假定任何有限數量的函數值的集合服從一個多元高斯分布。給定輸入數據點集合 { x 1 , x 2 , … , x n } \left…

2024.7.9作業

1、提示并輸入一個字符串&#xff0c;統計該字符串中字母、數字、空格以及其他字符的個數 #include <stdio.h> #include <string.h> int main(int argc,const char *argv[]) { char arr[30]{0}; int zm0,kg0,sz0,qt0; printf("請輸入字符串&…

OpenStack是一個開源的云計算平臺

OpenStack是一個開源的云計算平臺&#xff0c;由多個組件組成&#xff0c;這些組件協同工作&#xff0c;提供包括計算、網絡、存儲和身份服務在內的基礎設施即服務(IaaS)。OpenStack最初由NASA和Rackspace合作開發&#xff0c;目的是創建一個開放源代碼的云操作系統。 OpenSta…

智慧光伏一站式解決方案

光伏電站智慧化管理平臺&#xff0c;將現代先進的數字信息技術、通信技術、互聯網技術、云計算技術、大數據挖掘技術與光伏技術高度融合而形成。可以滿足光伏企業對電站的高發電量、低初始投資、低運維成本等需求&#xff0c;從開發到運維的25年生命周期內&#xff0c;實現高收…

使用clion刷leetcode

如何優雅的使用clion刷leetcode 安裝插件&#xff1a;LeetCode Editor) 插件配置&#xff1a; 這樣我們每打開一個項目&#xff0c;就會創建類似的文件 我們的項目結構&#xff1a; 我們在題解文件中導入頭文件myHeader.h并將新建的文件添加到cmakelists.txt文件&#xff0c;…

2024前端面試真題【JS篇】

DOM DOM&#xff1a;文本對象模型&#xff0c;是HTML和XML文檔的編程接口。提供了對文檔的結構化的表述&#xff0c;并定義可一種方式可以使從程序中對該結構進行訪問&#xff0c;從而改變文檔的結構、樣式和內容。 DOM操作 創建節點&#xff1a;document.createElement()、do…

hnust 1965: 深度優先搜索

hnust 1965: 深度優先搜索 題目描述 輸入一個圖&#xff0c;用鄰接矩陣存儲&#xff08;實際上也可以選擇鄰接表&#xff09;&#xff0c;并實現DFSTraverse操作。 拷貝前面已經實現的代碼&#xff0c;主函數必須如下&#xff0c;完成剩下的部分。 int main() { Graph g; Cre…

RTOS系統 -- 調試大法之FreeRTOS在M4上實現coredump功能

FreeRTOS內核崩潰&#xff08;coredump&#xff09;及異常打印技術 技術背景 在嵌入式系統中&#xff0c;FreeRTOS是一款廣泛使用的實時操作系統。FreeRTOS本身并不包含默認的coredump機制&#xff0c;但我們可以通過自定義異常處理函數來實現異常打印和coredump功能。通過捕…

了解PPO算法(Proximal Policy Optimization)

Proximal Policy Optimization (PPO) 是一種強化學習算法&#xff0c;由 OpenAI 提出&#xff0c;旨在解決傳統策略梯度方法中策略更新過大的問題。PPO 通過引入限制策略更新范圍的機制&#xff0c;在保證收斂性的同時提高了算法的穩定性和效率。 PPO算法原理 PPO 算法的核心…

Oracle數據庫自帶的內置表和視圖、常用內部視圖

文章目錄 一.Oracle數據庫自帶的內置表和視圖1.dba_開頭表2.user_開頭表3.v$開頭表4.all_開頭表5.session_開頭表6.index_開頭表 三.按組分的幾組重要的性能視圖1.System的over view2.某個session的當前情況3.SQL的情況4.Latch/lock/ENQUEUE5.IO方面的 分類類別關系群集、表、視…

【docker 把系統盤空間耗沒了!】windows11 更改 ubuntu 子系統存儲位置

系統&#xff1a;win11 ubuntu 22 子系統&#xff0c;docker 出現問題&#xff1a;系統盤突然沒空間了&#xff0c;一片紅 經過排查&#xff0c;發現 AppData\Local\packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\ 這個文件夾竟然有 90GB 下面提供解決辦法 步…

Spring-AOP(二)

作者&#xff1a;月下山川 公眾號&#xff1a;月下山川 1、什么是AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是一種設計思想&#xff0c;是軟件設計領域中的面向切面編程&#xff0c;它是面向對象編程的一種補充和完善&#xff0c;它以通過預編譯方式和運行期…

【課程總結】Day13(下):人臉識別和MTCNN模型

前言 在上一章課程【課程總結】Day13(上):使用YOLO進行目標檢測,我們了解到目標檢測有兩種策略,一種是以YOLO為代表的策略:特征提取→切片→分類回歸;另外一種是以MTCNN為代表的策略:先圖像切片→特征提取→分類和回歸。因此,本章內容將深入了解MTCNN模型,包括:MTC…

CountDownLatch 是 Java 中的一個同步輔助工具類

下面是一個使用 CountDownLatch 的案例分析&#xff0c;我們將通過一個簡單的示例來展示如何使用 CountDownLatch 來同步多個線程的操作。 ### 場景描述 假設我們有一個任務&#xff0c;需要從多個數據源&#xff08;比如多個數據庫表或文件&#xff09;中讀取數據&#xff0c…