【C++奇遇記】C++中的進階知識(繼承(一))

🎬 博客主頁:博主鏈接
🎥 本文由 M malloc 原創,首發于 CSDN🙉
🎄 學習專欄推薦:LeetCode刷題集 數據庫專欄 初階數據結構
🏅 歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
📆 未來很長,值得我們全力奔赴更美好的生活?

在這里插入圖片描述
在這里插入圖片描述

文章目錄

  • 😇本章詳情
  • 😇繼承的前情介紹
    • 📝繼承的概念(inheritance)
    • 📝繼承出現前后發生的變化
  • 😇繼承定義
    • 📝定義格式
  • ?基類和派生類間的轉換
    • 📋切片或切割
  • 📃如何鞏固學習
  • 📃本文小結

😇本章詳情

🐤本篇文章將講授C++的繼承相關的知識

😇繼承的前情介紹

📝繼承的概念(inheritance)

😁繼承(inheritance)機制是?向對象程序設計使代碼可以復?的最重要的?段,它允許我們在保持原有類特性的基礎上進?擴展,增加?法(成員函數)和屬性(成員變量),這樣產?新的類,稱派?類。繼承呈現了?向對象程序設計的層次結構,體現了由簡單到復雜的認知過程。以前我們接觸的函數層次的復?,繼承是類設計層次的復?。

📝繼承出現前后發生的變化


繼承出現前。舉例說明:在繼承沒出現前我們設計兩個類Student和Teacher類,代碼如下所示

class Student
{
public:// 進?校園/圖書館/實驗室刷?維碼等?份認證void identity(){// ...}// 學習void study(){// ...}
protected:string _name = "peter"; // 姓名string _address; // 地址string _tel; // 電話int _age = 18; // 年齡int _stuid; // 學號
};
class Teacher
{
public:// 進?校園/圖書館/實驗室刷?維碼等?份認證void identity(){// ...}// 授課void teaching(){//...}
protected:string _name = "張三"; // 姓名int _age = 18; // 年齡string _address; // 地址string _tel; // 電話string _title; // 職稱
};
int main()
{return 0;
}

看到上述代碼,我們會發現Student和Teacher類中的保護域當中的成員變量有很多都是冗余的,并且都有identity的成員函數,當然了其中也有各自沒有的成員的變量和成員函數。


那我們現在想解決這部分冗余的代碼,那么我們該如何處理呢?于是繼承應運而生

繼承出現后,我們就可以定義一個公共的成員Person類中,Student和Teacher都繼承Person,派生類Student和Teacher都可以繼承基類Person類中的成員變量,就不需要重復定義了。

class Person
{
public:// 進?校園/圖書館/實驗室刷?維碼等?份認證void identity(){cout << "void identity()" << _name << endl;}
protected:string _name = "張三"; // 姓名string _address; // 地址string _tel; // 電話int _age = 18; // 年齡
};
class Student : public Person
{
public:// 學習void study(){// ...}
protected:int _stuid; // 學號
};
class Teacher : public Person
{
public:// 授課void teaching(){//...}
protected:string title; // 職稱
};
int main()
{Student s;Teacher t;s.identity();t.identity();return 0;
}

觀察上述代碼,可以發現,派生類Student和Teacher類中并沒有_name,_address這些成員變量,也沒有identity這個成員函數,但是我們在main函數中,實例化了一個學生對象s和老師對象t,我們可以發現他居然可以調用Person類中的成員函數identity。


通過上述的小例子,是否已經對繼承有了初步的認識了呢?接下來我們進入對繼承正式的認識吧!

😇繼承定義

📝定義格式

觀察下圖

在這里插入圖片描述

觀察上圖我們可以知道,Person就是基類,也就是父類。Student是派生類,也稱為子類


關于繼承的一些小tips

  1. 使?關鍵字class時默認的繼承?式是private,使?struct時默認的繼承?式是public,不過最好顯示的寫出繼承?式。
  2. 在實際運?中?般使?都是public繼承,?乎很少使?protected/private繼承,也不提倡使?protected/private繼承,因為protected/private繼承下來的成員都只能在派?類的類??使?,實際中擴展維護性不強。

?基類和派生類間的轉換

📋切片或切割

💐public繼承的派?類對象 可以賦值給 基類的指針 / 基類的引?。這?有個形象的說法叫切?或者切割。寓意把派?類中基類那部分切出來,基類指針或引?指向的是派?類中切出來的基類那部分。

注意
基類對象不能復制給派生類對象
在這里插入圖片描述

我們上代碼來看一下吧

輸入

class Person
{
protected :string _name; // 姓名string _sex; // 性別int _age; // 年齡
};
class Student : public Person
{
public :int _No ; // 學號
};
int main()
{Student sobj ;// 1.派?類對象可以賦值給基類的指針/引?Person* pp = &sobj;Person& rp = sobj;// ?類對象可以賦值給基類的對象是通過調?后?會講解的基類的拷?構造完成的Person pobj = sobj;//2.基類對象不能賦值給派?類對象,這?會編譯報錯sobj = pobj;return 0;
}

注意

派生類Student中繼承了基類中的成員變量,于是我們用派生類對基類進行賦值,此時進行的就是切片。把派生類中繼承基類的部分切片賦值給基類中的成員變量。

📃如何鞏固學習

提示:在學習的過程中,我們需要先自行進行思考,并且多去閱讀一些大佬的書籍,俗話說的好,書籍是人類進步的階梯!

📃本文小結

  1. 這只是繼承中的一小部分知識,山高路遠,我們下期再見啦!!!!

好啦今日的分享到這里就結束啦,我是愛你們的M malloc希望可以幫助到你們噢,最后別忘記三連啦!!

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

【Scratch編程系列】Scratch編程軟件界面

Scratch是一款由麻省理工學院(MIT&#xff09; 設計開發的少兒編程工具。其特點是&#xff1a;使用者可以不認識英文單詞&#xff0c;也可以不使用鍵盤&#xff0c;就可以進行編程。構成程序的命令和參數通過積木形狀的模塊來實現。用鼠標拖動指令模塊到腳本區就可以了。 這個軟…

開篇 - 配置Unlua+VsCode的智能提示、調試以及學習方法

智能提示 為要綁定Lua的藍圖創建模板文件&#xff0c;這會在Content/Script下生成lua文件 然后點擊生成智能代碼提示&#xff0c;這會在Plugins/Unlua/Intermediate/生成Intenllisense文件夾 打開VSCode,點擊文件->將工作區另存為。生成一個空工作區&#xff0c;放置在工程…

QEMU-KVM加SPICE,云電腦誕生了

沒錯&#xff01;?QEMU-KVM SPICE? 的組合&#xff0c;本質上就是一套?輕量級云電腦&#xff08;云桌面&#xff09;?的解決方案。通過虛擬化技術將計算資源池化&#xff0c;再通過SPICE協議提供流暢的遠程桌面體驗&#xff0c;用戶用任意設備&#xff08;筆記本/平板/瘦客…

hashtable遍歷的方法有哪些

在 Java 中&#xff0c;遍歷 Hashtable&#xff08;或其現代替代品 HashMap&#xff09;有多種方式&#xff0c;以下是 6 種常用方法的詳細說明和代碼示例&#xff1a; 1. 使用 keySet() 增強 for 循環 Hashtable<String, Integer> table new Hashtable<>(); // …

如何完整遷移 Git 倉庫 ?

Git 已經成為軟件開發中版本控制和協作的事實上的標準。有時&#xff0c;開發人員可能需要將整個 Git 存儲庫 (包括其歷史記錄、分支和標記) 移動到新的位置或托管服務。在這個全面的指南中&#xff0c;我們將討論在不丟失任何關鍵數據或歷史記錄的情況下無縫地重新定位完整 Gi…

BPSK調制器的作用和基本原理

BPSK&#xff08;Binary Phase Shift Keying&#xff0c;二進制相移鍵控&#xff09;調制器是數字通信系統中的關鍵組件&#xff0c;其核心作用是將二進制數字信號轉換為模擬載波信號&#xff0c;通過相位變化傳遞信息。其具體作用的詳細說明如下&#xff1a; 一、BPSK調制器的…

LeetCode-98. 驗證二叉搜索樹

一、題目 給定一個二叉樹&#xff0c;判斷其是否是一個有效的二叉搜索樹。假設一個二叉搜索樹具有如下特征&#xff1a; 若它的左子樹不空&#xff0c;則左子樹上所有結點的值均小于它的根結點的值&#xff1b; 若它的右子樹不空&#xff0c;則右子樹上所有結點的值均大于它的…

Python菜鳥教程(小程序)

目錄 一.簡易計算器 二.學生成績分級 三.密碼設置 四.作業選擇 點贊收藏,評論支持 一.簡易計算器 print(-------使用的運算符-------\n) print(1.加號) print(2.減號) print(3.乘號) print(4.除號) Aint(input(請輸入第一個數: )) Bint(input(請輸入第二個數: )) Fi…

Golang的Goroutine(協程)與runtime

目錄 Runtime 包概述 Runtime 包常用函數 1. GOMAXPROCS 2. Caller 和 Callers 3. BlockProfile 和 Stack 理解Golang的Goroutine Goroutine的基本概念 特點&#xff1a; Goroutine的創建與啟動 示例代碼 解釋 Goroutine的調度 Gosched的作用 示例代碼 輸出 解…

Dubbo(30)如何配置Dubbo的服務分片?

配置Dubbo的服務分片&#xff08;也稱為服務分組&#xff09;可以幫助你將不同的服務實例分組&#xff0c;以實現隔離和管理。通過服務分片&#xff0c;可以在同一個注冊中心中注冊多個相同接口的服務&#xff0c;但它們屬于不同的分組&#xff0c;消費者可以根據需要選擇特定分…

文檔的預解析

1. 預解析的核心目標 瀏覽器在正式解析&#xff08;Parsing&#xff09;HTML 前&#xff0c;會啟動一個輕量級的 預解析器&#xff08;Pre-Parser&#xff09;&#xff0c;快速掃描文檔內容&#xff0c;實現&#xff1a; 提前發現并加載關鍵資源&#xff08;如 CSS、JavaScrip…

通過構造函數和幾何條件,研究了不同函數的最近點存在性、性質及單調性

解&#xff1a; &#xff08;1&#xff09;對于函數 f ( x ) 1 x f(x) \frac{1}{x} f(x)x1? 和點 M ( 1 , 0 ) M(1, 0) M(1,0)&#xff0c;構造函數 s ( x ) ( x ? 1 ) 2 ( 1 x ) 2 s(x) (x - 1)^2 \left(\frac{1}{x}\right)^2 s(x)(x?1)2(x1?)2。求導得到 s ′ …

C語言之編譯和debug工具

gcc gcc是GUN項目為C和C提供的編譯器 入門案例 gcc編譯器最簡單的使用案例&#xff1a;gcc hello.c -o hello&#xff0c;hello.c是源文件&#xff0c;-o參數指定了結果文件的名稱 gcc命令的選項&#xff1a; -v&#xff1a;打印編譯細節-E&#xff1a;僅僅進行預處理&…

Altshuller矛盾矩陣查詢:基于python和streamlit

基于python和streamlit實現的Altshuller矛盾矩陣查詢 import streamlit as st import json# 加載數據 st.cache_resource def load_data():with open(parameter.json, encodingutf-8) as f:parameters json.load(f)with open(way.json, encodingutf-8) as f:contradictions …

Maven的下載配置及在Idea中的配置

編寫項目管理中存在的問題 在大型Java項目開發中&#xff0c;依賴管理是一個極其復雜的挑戰。傳統方式下&#xff0c;開發者需要手動下載并引入數十甚至上百個JAR包到項目中&#xff0c;這一過程不僅繁瑣低效&#xff0c;還存在諸多痛點&#xff1a; 依賴傳遞性問題&#xff1a…

來聊聊C++中的vector

一.vector簡介 vector是什么 C 中的 vector 是一種序列容器&#xff0c;它允許你在運行時動態地插入和刪除元素。 vector 是基于數組的數據結構&#xff0c;但它可以自動管理內存&#xff0c;這意味著你不需要手動分配和釋放內存。 與 C 數組相比&#xff0c;vector 具有更多的…

WVP-GB28181攝像頭管理平臺存在弱口令

免責聲明&#xff1a;本號提供的網絡安全信息僅供參考&#xff0c;不構成專業建議。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權&#xff0c;請及時與我聯系&#xff0c;我將盡快處理并刪除相關內容。 漏洞描述 攻擊者可利用漏洞獲取當前系統管…

訊飛語音聽寫(流式版)開發指南

語音交互大模型的功能越來越受到重視。訊飛語音聽寫&#xff08;流式版&#xff09;為開發者提供了一種高效、準確的語音識別解決方案。本文將基于 Home.vue、iat_xfyun.js 和 sparkChat.js 這三個文檔&#xff0c;詳細闡述訊飛語音聽寫&#xff08;流式版&#xff09;的開發邏…

基于kotlin native的C與kotlin互相調用

本文測試環境為ubuntu&#xff0c;沒有使用IDE&#xff1b;從基本層面了解kotlin native環境中&#xff0c;C和kotlin的編譯&#xff0c;互相調用。 1. kotlin 動態庫 1.1 動態庫編譯 源碼文件libktest.kt&#xff1a; //file name:libktest.kt OptIn(kotlin.experimental.…

【教學類-102-02】自制剪紙圖案(留白邊、沿線剪)02——Python+PS自動化添加虛線邊框

背景需求: 01版本實現了對透明背景png圖案邊界線的擴展,黑線實線描邊 【教學類-102-01】自制剪紙圖案(留白邊、沿線剪)01-CSDN博客文章瀏覽閱讀974次,點贊15次,收藏7次。【教學類-102-01】自制剪紙圖案(留白邊、沿線剪)01https://blog.csdn.net/reasonsummer/article…