25. C++繼承 1 (繼承的概念與基礎使用, 繼承的復制兼容規則,繼承的作用域)

?上篇模板文章:24. C++模板 2 (非類型模板參數,模板的特化與模板的分離編譯)-CSDN博客

?本篇代碼:c++學習 · 橘子真甜/c++-learning-of-yzc - 碼云 - 開源中國 (gitee.com)

?標?是比較重要的部分

目錄

一. 繼承的基礎使用

1.1 繼承的格式

1.2 代碼舉例

1.3 派生類訪問基類成員的變化?

二. 繼承的復制兼容規則??

?三. 繼承中的作用域

3.1 基類可以訪問父類成員函數

3.2 基類與派生類的重定義


一. 繼承的基礎使用

? ? ? ? 繼承的面向對象程序設計提高代碼復用的重要手段,它允許我們在保持原有類的成員的基礎上對這個類進行拓展。之前我們大多都是函數的復用,繼承是類的復用。

? ? ? ? 被繼承的類稱為基類(父類),繼承基類的類稱為派生類(子類)。

? ? ? ??比如我們有一個person類,而學生,職工,教師等類都有著person類的屬性(年齡,性別,電話,身份證等)而學生有自己特有的學號,教師職工有自己的工號。

????????此時我們就能通過繼承讓學生,教師,職工類獲取person的成員,還能重新定義自己特有的成員。

1.1 繼承的格式

class Person
{};class Student :public Person
{};

在新定義的類后面使用一個 : 后面依次接 繼承方式 基類

?

1.2 代碼舉例

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "張三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年齡:" << _age << endl;}
private:size_t _age;string _name;
};class Student :public Person
{
private:string _stuid;
};class Teacher :public Person
{
private:string _tcid;
};int main()
{Person p1;p1.print();Student st1;st1.print();Teacher tc1;tc1.print();return 0;
}

上面代碼中我們定義一個person類,在定義學生和教師類來繼承person?。

我們都調用print函數,運行結果如下:

可見:學生類和教師類(派生類)都能夠繼承person類(基類)的姓名,年齡和print函數

1.3 派生類訪問基類成員的變化?

? ? ? ? 繼承的方式有三種,public,protected,private。不同的繼承方式,子類訪問父類有限定。

類成員/繼承方式public繼承protected繼承private繼承
基類public成員派生類public成員派生類protected成員派生類private成員
基類protected成員派生類protected成員派生類protected成員派生類private成員
基類private成員派生類不可訪問派生類不可訪問派生類不可訪問

?根據上述表格,我們可以有以下總結

1 基類的private成員在派生類中不可見。即這個成員被派生類繼承,但是在派生類的類內類外都無法訪問基類的private成員

2 protected繼承就是為了解決基類private成員無法在派生類訪問的問題(即如果我們想要在派生類訪問基類的私有成員,在基類中將其定義為protected成員即可)

3 實際上,為了提高代碼的復用和拓展。我們一般都使用public繼承

4 class定義類的默認繼承方式是private,struct定義類的默認繼承方式是public。不過我們在使用中一般都會顯示定義類的繼承方式。

?

?若是保護成員,在派生類中可以訪問

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "張三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年齡:" << _age << endl;}
protected:size_t _age;string _name;
};class Student :public Person
{
public:void show(){cout << "姓名:" << _name << " 年齡:" << _age << endl;}
private:string _stuid;
};int main()
{Person p1;p1.print();Student st1;st1.show();return 0;
}

我們在Student類中定義一個show函數來訪問基類的保護成員

二. 繼承的復制兼容規則??

派生類的對象可以賦值給 基類,基類的指針,基類的引用(稱為切片,切割)

基類的對象不能賦值給派生類

基類的指針在特定情況下可以強制轉化為派生類的指針

代碼舉例:

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "張三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年齡:" << _age << endl;}
protected:size_t _age;string _name;
};class Student :public Person
{
public:void set(int age, const string& name,int stuid){_age = age;_name = name;_stuid = stuid;}void show(){cout << "姓名:" << _name << " 年齡:" << _age << " ID:" << _stuid << endl;}
private:string _stuid;
};int main()
{Student st1;st1.set(50, "李四", 123456);st1.print();Student st2;Person p1 = st1;	//直接賦值p1.print();Person* p2 = &st2;	//基類指針p2->print();Person& p3 = st2;	//基類引用p3.print();return 0;
}

運行結果如下:

?若是將基類賦值給派生類就會報錯

???????

?三. 繼承中的作用域

1 在繼承中,基類和派生類有自己獨立的作用域。對于派生類來說,調用成員的時候會現在自己的類中尋找,如果自己的類中沒有定義,再去基類中尋找成員

2?基類和其派生類有相同名稱的成員,派生類會隱藏基類的成員。這兩個成員構成重定義。

3 重定義不是重載。雖然兩個成員名稱相同,但是它兩的作用域不一樣,不是重載

3.1 基類可以訪問父類成員函數

舉例代碼如下:基類沒有print函數,會去父類尋找并調用print函數

#include <iostream>
using namespace std;class Person
{
public:Person(int age = 18, const string& name = "張三"):_age(age), _name(name){};void print(){cout << "姓名:" << _name << " 年齡:" << _age << endl;}
protected:size_t _age;string _name;
};class Student :public Person
{
private:string _stuid;
};int main()
{Student st1;st1.print();return 0;
}

測試結果如下:

?

3.2 基類與派生類的重定義

如果父子類有重定義,子類無法直接調用父類的成員

?

調用自己的成員

#include <iostream>
using namespace std;class A
{
public:void f() { cout << "hello world!" << endl; }
};class B :public A
{
public:void f(int i) { cout << "hello world!" << i << endl; }
};int main()
{A a;B b;a.f();b.f(10);return 0;
}

?如果父子類構成重定義,子類想要訪問父類同名成員,需要指定作用域

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

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

相關文章

露營小程序搭建有哪些步驟?小程序里面可以找個露營搭子

露營不僅僅是走進大自然的旅程&#xff0c;它也成為了一種社交和體驗式的活動。隨著小程序的普及&#xff0c;露營活動也越來越多地開始在線上開展。通過搭建一個露營小程序&#xff0c;商家不僅可以為用戶提供更多的露營選擇&#xff0c;還可以幫助他們找到合適的露營搭子。那…

XIAO ESP32 S3網絡攝像頭——2視頻獲取

本文主要是使用XIAO Esp32 S3制作網絡攝像頭的第2步,獲取攝像頭圖像。 1、效果如下: 2、所需硬件 3、代碼實現 3.1硬件代碼: #include "WiFi.h" #include "WiFiClient.h" #include "esp_camera.h" #include "camera_pins.h"// 設…

記一次 dockerfile 的循環依賴錯誤

文章目錄 1. 寫在最前面1.1 具體循環依賴的例子 2. 報錯的位置2.1 代碼快速分析2.2 代碼總結2.3 關于 parser 的記錄 3. 碎碎念 1. 寫在最前面 筆者在使用 dockerfile 多階段構建的功能時&#xff0c;寫出了一個「circular dependency detected on stage: xx」的錯誤。 解決方…

AAAI 2025論文分享┆一種接近全監督的無訓練文檔信息抽取方法:SAIL(文中附代碼鏈接)

本推文詳細介紹了一篇上海交通大學樂心怡老師課題組被人工智能頂級會議AAAI 2025錄用的的最新論文《SAIL: Sample-Centric In-Context Learning for Document Information Extraction》。論文的第一作者為張金鈺。該論文提出了一種無需訓練的、以樣本為中心的、基于上下文學習的…

小程序信息收集(小迪網絡安全筆記~

免責聲明&#xff1a;本文章僅用于交流學習&#xff0c;因文章內容而產生的任何違法&未授權行為&#xff0c;與文章作者無關&#xff01;&#xff01;&#xff01; 附&#xff1a;完整筆記目錄~ ps&#xff1a;本人小白&#xff0c;筆記均在個人理解基礎上整理&#xff0c;…

pat 乙級1096 大美數

若正整數 N 可以整除它的 4 個不同正因數之和&#xff0c;則稱這樣的正整數為“大美數”。本題就要求你判斷任一給定的正整數是否是“大美數”。 輸入格式&#xff1a; 輸入在第一行中給出正整數 K&#xff08;≤10&#xff09;&#xff0c;隨后一行給出 K 個待檢測的、不超過…

C#封送類

封送類&#xff08;Marshaling classes&#xff09;在.NET框架中扮演著至關重要的角色&#xff0c;尤其是在托管代碼與非托管代碼之間進行數據交換時。封送過程涉及到將托管環境中的對象轉換為非托管環境中可以理解的形式&#xff0c;并且反之亦然。這一過程確保了兩種不同類型…

計算機體系結構期末考試

1、描述計算機系統性能評估的關鍵指標&#xff0c;并以SPEC CPU benchmark為例&#xff0c;討論如何使用幾何平均數與加權平均數對性能進行量化。此外&#xff0c;描述Amdahl定律并分析該定律的應用場景及其對性能優化的局限性 2、請對比RISC和CISC指令集架構的設計思想及優缺點…

藥片缺陷檢測數據集,8625張圖片,使用YOLO,PASICAL VOC XML,COCO JSON格式標注,可識別藥品是否有缺陷,是否完整

藥片缺陷檢測數據集&#xff0c;8625張圖片&#xff0c;使用YOLO&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式標注&#xff0c;可識別藥品是否有缺陷&#xff0c;是否完整 有缺陷的標注信息&#xff1a; 無缺陷的標注信息 數據集下載&#xff1a; yolov11:https://d…

一文講清楚CSS3新特性

文章目錄 一文講清楚CSS3新特性1. 新增選擇器特性2. 新增的樣式3. 新增布局方式 一文講清楚CSS3新特性 1. 新增選擇器特性 層次選擇器(div~p)選擇前面有div的p元素偽類選擇器 :first-of-type 表示?組同級元素中其類型的第?個元素:last-of-type 表示?組同級元素中其類型的最…

【Ubuntu使用技巧】Ubuntu22.04無人值守Crontab工具實戰詳解

一個愿意佇立在巨人肩膀上的農民...... Crontab是Linux和類Unix操作系統下的一個任務調度工具&#xff0c;用于周期性地執行指定的任務或命令。Crontab允許用戶創建和管理計劃任務&#xff0c;以便在特定的時間間隔或時間點自動運行命令或腳本。這些任務可以按照分鐘、小時、日…

第十六屆藍橋杯模擬賽(第一期)(C語言)

判斷質因數 如果一個數p是個質數&#xff0c;同時又是整數a的約數&#xff0c;則p稱為a的一個質因數。 請問2024有多少個質因數。 了解 約數&#xff0c;又稱因數。整數a整除整數b&#xff0c;b為a的因數&#xff08;約數&#xff09;質數&#xff0c;又稱素數。只有1和它本身兩…

electron在arm64架構交叉編譯遇到libnotify/notify.h文件找不到錯誤記錄

問題描述 在按照官方文檔進行arm64下electron編譯時出現下面的錯誤&#xff0c;編譯環境為ubuntun22.04.5。 問題分析 由于當前目標架構是arm64&#xff0c;所以從上圖可知sysroot為build/linux/debian_bullseye_arm64-sysroot&#xff0c;進入到該目錄下查看libnotify的頭文…

KAFKA入門:原理架構解析

文章目錄 一、認識kafka二、架構介紹2.1 工作流程2.2 Kafka可靠性保證2.3 Kafka存儲 一、認識kafka Kafka到底是個啥&#xff1f;用來干嘛的&#xff1f; 官方定義如下&#xff1a; Kafka is used for building real-time data pipelines and streaming apps. It is horizont…

論文分享 | PromptFuzz:用于模糊測試驅動程序生成的提示模糊測試

大語言模型擁有的強大能力可以用來輔助多種工作&#xff0c;但如何有效的輔助仍然需要人的精巧設計。分享一篇發表于2024年CCS會議的論文PromptFuzz&#xff0c;它利用模型提示生成模糊測試驅動代碼&#xff0c;并將代碼片段嵌入到LLVM框架中執行模糊測試。 論文摘要 制作高質…

利用Python爬蟲獲取1688商品詳情的探索之旅

在當今數字化時代&#xff0c;數據已成為一種寶貴的資源。對于電商行業來說&#xff0c;獲取商品信息尤為重要。阿里巴巴旗下的1688平臺&#xff0c;作為中國領先的B2B電子商務平臺&#xff0c;提供了海量的商品信息。本文將帶你了解如何使用Python爬蟲技術&#xff0c;合法合規…

[算法] [leetcode-1137] 第 N 個泰波那契數

1137 第 N 個泰波那契數簡單 泰波那契序列 Tn 定義如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的條件下 Tn3 Tn Tn1 Tn2 給你整數 n&#xff0c;請返回第 n 個泰波那契數 Tn 的值。 示例 1&#xff1a; 輸入&#xff1a;n 4 輸出&#xff1a;4 解釋&#x…

macOS上怎么制作條形碼

推薦使用Barcode Flow APP&#xff0c;目前支持iOS、macOS、iPadOS 大家可以在app store里面搜索 支持幾乎所有條形碼的格式 gs128、code128、DataMaxitr等等。 導出和打印都可以。 還支持工具規則自動生成。

位運算與操作符應用

一.二進制與進制轉化 1.概念解析 我們常常能聽見2進制&#xff0c;8進制&#xff0c;16進制這些講法。他們都是數值的不同表達形式。根據不同的進制大小有著不同的權重比例。我們生活中常用的是10進制數&#xff0c;也就是逢10進1&#xff0c;由此推理至其他進制。例如2進制就…

適配器模式概述

大體介紹 適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;其核心目的是通過提供一個適配器類來使得原本接口不兼容的類可以一起工作。它通過將一個類的接口轉換成客戶端所期望的接口&#xff0c;使得原本因接口不兼容而無法一起工作的類可…