C++(面向對象之繼承、多態)

一、繼承

前言

在c++里面,繼承是指2個類之間的關系

例如:有一個org類,功能很完善,體量很大,突然有一天,需求發生改變,org類不能滿足新的需求,我們的第一想法是,復制 org 類代碼,粘貼成 new 代碼,然后在new代碼里面寫新的函數,以滿足新需求,但是我們有時無法復制粘貼,有可能體量太大,復制不方便。有可能該類我們沒有源代碼,沒有辦法去復制,所以我們應該使用繼承,讓new類繼承自 org類,一旦繼承過后,new類即使什么都不寫,就會天然的擁有org類里面所有的數據和函數

在繼承里面:
org類:? 我們稱為父類 或者 基類
new類:我們稱為子類 或者 派生類

1、繼承的語法格式

class org{    
}
class new:public/protected/private org{
}

2、三種繼承方式

????????繼承類時有 public / protected / private 三種繼承方式

1)不同繼承方式下基類的訪問權限

原有權限? \? 繼承方式publicprotectedprivate
publicpublicprotectedprivate
protectedprotectedprotectedprivate
privateprivate(被隱藏)private(被隱藏)private(被隱藏)

在繼承中 protected 和 private 的區別

在繼承過后,派生類無法內部訪問基類的私有成員,但是派生類可以內部訪問基類的受保護成員

?2)繼承的本質

其實繼承就相當于復制粘貼,只是復制粘貼這一步是由編譯器在編譯那一步完成的

3、繼承到底繼承哪些內容

1)可以繼承的內容

運算符重載函數、靜態成員屬性、靜態成員方法、構造函數和析構函數

????????構造函數和析構函數要特別注意,雖然派生類繼承了基類的構造函數和析構函數,但是并不是說將基類的構造函數和析構函數繼承給派生類作為構造函數和析構函數,只是繼承在派生類中,在構造和析構基類的對象時可以調用。?

2)不能繼承的內容

友元函數:是關于類的一種關系,并不是類的成員,自然不能繼承

4、初始化及訪問基類私有成員

1)初始化基類的私有成員

私有成員不論是派生類還是基類,都只能類中訪問,構造類中的成員也只能由自己的構造函數完成
因此可以在派生類的初始化列表中調用基類的構造函數來初始化。

注意:派生類只能調用直接基類的構造函數,不能夸輩調用構造函數。
例如:A繼承B,B繼承C,A可以調用B的構造函數,但是不能調用C的構造函數

2)訪問基類私有成員?

外部訪問類的私有成員需要類中設有公開接口才能訪問,派生類訪問基類的私有成員也是一樣的

5、基類、派生類、派生類中的對象的構造順序

在構建派生類對象時,按照執行順序,會先構造基類,再構建派生類中的對象,最后是派生類自己

構造的順序是:
基類 -> 派生類中的對象 -> 派生類本身

析構的順序是:(遵循先進后出原則,先構建的后析構)
派生類本身 -> 派生類中的對象 -> 基類

6、基類、派生類中的重名函數或變量

7、繼承關系

1)多級繼承

2)繼承組

3)多重繼承

4)菱形繼承

8、多重繼承

9、菱形繼承

1)菱形繼承存在的問題

2)virtusl(虛繼承)

二、多態

前言

多態是指,基類可以調用多個不同派生類對象的成員方法的能力

1、多態的實現

1)多態是通過virtual (虛函數)?來實現的(步驟)

  1. 聲明虛函數:在基類中用關鍵字virtual 聲明虛函數
  2. 重寫虛函數:將派生類中要調用的函數名重寫,與虛函數名同名同參
  3. 通過引用/指針調用:使用基類類型的指針或引用指向派生類的對象,并調用基類的虛函數

2)示例

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <vector>
#include <memory>
#include <unistd.h>using namespace std;class Core{private:public:virtual void func()//聲明虛函數{cout << "基類函數" << endl;}
};class Core_pro:public Core{private:public:void func()//將想要調用的函數寫為和虛函數同名同參的函數{cout << "派生類函數1" << endl;}
};class Core_pro_max:public Core{private:public:void func()//將想要調用的函數寫為和虛函數同名同參的函數{cout << "派生類函數2" << endl;}
};class Person{private:public://以引用類型接收變量,調用不同派生類的成員方法void work1(Core& c){c.func();}//以指針類型接收變量,調用不同派生類的成員方法void work2(Core* c){c->func();}
};      int main(int argc,const char** argv)
{Core c;Core_pro cp;Core_pro_max cpm;Person zs;//傳入變量zs.work1(c);zs.work1(cp);zs.work1(cpm);//傳入地址zs.work2(&c);zs.work2(&cp);zs.work2(&cpm);return 0;                        
}

3)多態作業練習:

1:寫一個Msg消息隊列類,要求有以下功能Msg m() 構造函數,創建消息隊列m[1] << "hello" 向消息隊列的1頻道寫入數據"hello",當然可以是其他的字符串數據m[2] >> str :從2頻道讀取消息,并且將讀到的消息存入str中析構函數:刪除消息隊列

2:寫一個員工類 Employee,有一個多態函數叫做 getSalary有一個 Cleanner 保潔類,繼承自員工類:每個月獲得 5000 工資有一個 Coder 程序員類,繼承自員工類,每個月獲得 10000工資有一個 Manger 經理類,繼承自員工類,每個月獲得 15000工資寫一個發工資的函數,要求,能夠為所有員工發放工資,即使追加新的崗位,也不會改變這個函數的邏輯

3:寫一個基類叫做顏色寫3個派生類,紅綠藍以及需要存在的其他顏色,繼承自顏色類要求實現以下功能:Red rGreen g;Color new_color = r + gnew_color.show() ;// 終端輸出 "黃色"


2、多態的原理

1)解析

  1. 多態的過程,其實是在基類的作用域中找到派生類的成員方法的過程
  2. 在基類中寫入虛函數后,基類會含有一個指針,就是虛函數指針,該指針指向虛函數列表
  3. 繼承,過程中,編譯器會將基類深拷貝到派生類中,自然也會拷貝虛函數列表;
  4. 重寫虛函數(覆蓋),編譯器會將派生類的虛函數,覆蓋到基類的虛函數列表中;
  5. 查找成員方法時,由于派生類的虛函數被重寫到基類中,自然就只能查找到基類中的虛函數

2)多態的總結

  1. 基類有虛函數,就會有虛函數列表,所有虛函數都存放在虛函數列表里面
  2. 派生類繼承自基類的時候,同時繼承了虛函數列表
  3. 派生類重寫基類虛函數的時候,就會將虛函數列表中的基類的虛函數給覆蓋

為什么會覆蓋:因為同名同參,又在同一作用域中,不覆蓋會出現問題,也因此派生類重寫基類虛函數的行為,也叫覆蓋(2個名字,可以叫重寫,可以叫覆蓋)

3)函數重載和函數重寫的區別

  1. 函數重載:要求寫在同一個作用域中,函數重寫:要求在不同作用域中
  2. 函數重載:要求同名不同參,函數重寫:要求同名同參
  3. 函數重載:是靜態多態,又被稱作編譯期多態
    函數重寫:是動態多態,又被稱作運行期多態

3、多態的繼承方式

多態的繼承方式:公開繼承(public)(想要多態,就必須使用公開繼承)

多態訪問派生類函數:
實際上是通過派生類中,指向基類內部虛函數列表的指針,去訪問的;
并且虛函數列表的訪問權限也是收到繼承權限的限制的;
因此,虛函數列表,必須是公開繼承,才能實現多態

4、多態中的析構函數

5、純虛類

1)純虛類的特點

2)純虛類的創建

創建純虛類只需要保證類中,至少擁有一個純虛函數

(1)什么是純虛函數

純虛函數是沒有定義的,不能被調用的

(2)怎么設置純虛函數
  • 將函數設置為虛函數
  • 直接將 "聲明部分" =0 即可

3)純虛類的作用

6、設計模式

設計模式:其實就是針對多態,各種方式的公式化運用

1)設計模式的五大原則

(1)接口隔離(獨立)原則
(2)開閉原則
(3)單一原則
(4)依賴倒置原則
(5)里氏替換原則

2)策略模式


3)代理模式


4)觀察者模式


5)簡單工廠模式



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

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

相關文章

【數據可視化-75】北京密云區2025年7月暴雨深度分析:Python + Pyecharts 炫酷大屏可視化(含完整數據、代碼)

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

Voxtral Mini:語音轉文本工具,支持超長音頻,多國語音

Voxtral是什么 Mistral AI 推出的 Voxtral 是一款強大的音頻模型&#xff0c;專為語音交互打造&#xff0c;具備卓越的語音轉寫和語義理解能力。它提供 24B 和 3B 兩種版本&#xff0c;分別適用于大規模生產和本地部署。Voxtral 支持多語言、長文本上下文、問答與總結&#xf…

React Native環境配置完整版(超詳細)

目錄 第一步&#xff1a;打開React Native官方網站 第二步&#xff1a;安裝NVM與Node.js 一、安裝NVM 二、使用NVM安裝Node.js 三、NVM使用說明 四、環境變量配置 第三步&#xff1a;安裝JDK 一、JDK介紹 二、下載與安裝JDK 三、環境配置 四、驗證是否配置成功 第四…

Rust 最短路徑、Tide、Partial、Yew、Leptos、數獨實踐案例

基于Rust的Meta和pyrefly相關實例 以下是一些基于Rust的Meta和pyrefly相關實例的示例代碼和用法。這些示例涵蓋了常見的使用場景,包括元編程、代碼生成、Python交互等。 基本元編程示例 使用Rust的宏和元編程功能生成代碼。 macro_rules! greet {($name:expr) => {prin…

Microsoft-DNN NTLM暴露漏洞復現(CVE-2025-52488)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前…

Windows上WSL2實例與宿主機橋接網絡實現局域網互通

在 WSL 2 中&#xff0c;默認使用 NAT 網絡模式&#xff0c;這會導致 WSL 實例和宿主機所在的局域網無法直接互通。要讓 WSL 2 和宿主機所在的局域網互通&#xff0c;可以通過以下步驟配置 wsl.conf 并結合宿主機網絡設置&#xff0c;啟用 WSL 2 的橋接模式&#xff1a;修改 ws…

程序代碼篇---數據包解析

數據包解析是不同設備&#xff08;如電腦、ESP32 等嵌入式設備&#xff09;之間通信的核心環節。簡單說&#xff0c;就是把收到的 "一串數據" 翻譯成雙方都能理解的 "具體信息"&#xff08;比如溫度、濕度、命令等&#xff09;。下面介紹幾種常見的數據包格…

【開發雜談】用AI玩AI聊天游戲:使用 Electron 和 Python 開發大模型語音聊天軟件

項目地址&#xff1a; GitHub | wfts-ai-chathttps://github.com/HiMeditator/wfts-ai-chat 前言 最近一個基于 AI 的聊天游戲 Whispers from the Stars&#xff08;群星低語&#xff09;的 Demo 版本發布了。《Whispers from the Star》是一款科幻主題互動游戲。背景設定在…

SQL優化系統解析

MySQL的安裝就不講述了, 本篇文章著重講解sql優化 本篇是對B站顏群老師視頻講解的筆記梳理, 感興趣的可以去看下老師的原視頻: SQL優化 MySQL原理 1. MySQL邏輯分層: 連接層->服務層->引擎層->存儲層(如圖) 連接層&#xff1a;提供與客戶端連接的服務服務層&#…

【機器學習案列-25】電信用戶流失預測:從數據處理到模型評估

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

【MATLAB代碼】灰色預測與多項式預測、指數平滑預測的對比,包含預處理、模型構建和和可視化輸出。模擬預測若干年的GDP,訂閱后可查看完整代碼,有中文注釋

代碼實現了灰色預測模型GM(1,1)在GDP預測中的應用,并結合線性回歸、二次多項式回歸和指數平滑模型進行對比分析。代碼包含數據預處理、模型構建、可視化輸出和誤差驗證四個核心模塊,實現了從數據輸入到預測結果展示的全流程。 文章目錄 運行結果 MATLAB源代碼 GM(1,1)模型數學…

搜索二維矩陣Ⅱ C++

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性&#xff1a; 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {i…

如何在 Apache Ignite 中創建和使用自定義 SQL 函數(Custom SQL Functions)

這段內容講的是 如何在 Apache Ignite 中創建和使用自定義 SQL 函數&#xff08;Custom SQL Functions&#xff09;。我們可以分步驟來理解它的含義和用法。&#x1f4da; 一、什么是 Custom SQL Function&#xff1f; Apache Ignite 的 SQL 引擎支持 標準 SQL 函數&#xff08…

Oracle 11g RAC數據庫實例重啟的兩種方式

Oracle 11g RAC數據庫實例重啟的兩種方式 使用SQLPlus重啟數據庫實例 使用SRVCTL重啟數據庫實例 Administrator-Managed還是Policy-Managed ?? 關于關閉RAC的數據庫實例: 在Oracle RAC中,單獨關閉一個實例不會影響到其他正在運行的實例。 要完全關閉Oracle RAC數據庫,需要…

分別使用 Java 8 和 Python 調用 Elasticsearch 接口簡單獲取數據

使用 Java 8 首先,確保在您的 pom.xml 文件中添加了正確的 Maven 依賴: <dependency><groupId>co.elastic.clients</groupId><artifactId>elastic

【通識】數據結構

數據結構邏輯結構物理結構&#xff08;存儲結構&#xff09;&#xff0c;數據結構是計算機中存儲、組織數據的方式。 其中物理結構是數據的邏輯結構在計算機中的存儲形式。而存儲器針對內存而言&#xff0c;像硬盤、軟盤、光盤等外部存儲器的數據組織常用文件結構描述。1. 基礎…

Ubuntu22.04提示找不到python命令的解決方案

Ubuntu22.04提示找不到python命令的解決方案 問題背景 在Ubuntu22.04中按照獲取Openharmony源碼中的如下命令&#xff1a; // 方式一&#xff08;推薦&#xff09;&#xff1a;通過repo ssh下載&#xff08;需注冊公鑰&#xff0c;請參考碼云幫助中心&#xff09;。repo in…

RabbitMQ面試精講 Day 6:消息確認與事務機制

【RabbitMQ面試精講 Day 6】消息確認與事務機制 開篇 歡迎來到"RabbitMQ面試精講"系列的第6天&#xff01;今天我們將深入探討RabbitMQ中確保消息可靠性的兩大核心機制&#xff1a;消息確認與事務機制。這兩個特性是面試中高頻出現的熱點問題&#xff0c;也是生產環…

被困擾的elementplus樣式修改問題:select選擇器修改和el-input修改

一、Select選擇器的原生樣式的本來面貌這是原生的沒有經過任何加工的面貌&#xff1a;這是沒有經過任何加工的選中時出現下拉框的面貌&#xff1a;這是沒有經過加工的懸浮下拉菜單的面貌&#xff1a;這是沒有經過加工的選中時的面貌&#xff1a;二、如何修改Select選擇器&#…

GO 從入門到精通2

Go語言的反射&#xff08;Reflection&#xff09;機制通過 reflect 包實現&#xff0c;允許程序在運行時動態檢查、修改和操作變量的類型信息和值。以下是反射的核心概念、用法及注意事項的詳細解析&#xff1a;一、反射的基本概念reflect.Type 表示變量的類型信息&#xff0c;…