【C++】8___繼承

目錄

?一、基本語法

?二、繼承方式

三、對象模型

四、繼承中的構造與析構的順序

五、繼承中同名成員處理

?六、多繼承語法

?七、菱形繼承


?一、基本語法

好處:減少重復的代碼

語法: class? ?子類? :? 繼承方式? ?父類

子類? 也稱為? 派生類

父類? 也稱為? 基類

派生類中的成員,包含兩大部分:

一類是從基類繼承過來的,一類是自己增加的成員

從基類繼承過來的表現其共性,而新增的成員體現了其個性

?二、繼承方式

  • class 子類 :public 父類

????????父類中的public、protected繼承在子類中依然不變,私有權限無法繼承。

  • class 子類 :protected 父類

?????????父類中的public、protected繼承在子類時變為protected,私有權限無法繼承。

  • class 子類 :private 父類

????????父類中的public、protected繼承在子類時變為private,私有權限無法繼承。

?代碼示例

#include<iostream>
using namespace std;class base1{public:int m_A;
protected:int m_B;
private:int m_C;
};// public 繼承
class Son1 : public base1{  void fun(){m_A = 10;m_B = 10;
//		m_C = 10; //私有權限無法繼承}
};
void test1(){Son1 son1;son1.m_A = 2;
//	son1.m_B = 3;
//	son1.m_C = 4;
}// protected 繼承
class Son2 : protected base1{void fun(){m_A = 10; //變為protectedm_B = 10;//變為protected//m_C = 10; //私有權限無法繼承}
};
void test2(){Son2 son2;//	son2.m_A = 2; //變為protected,類外無法訪問//	son2.m_B = 3; //變為protected,類外無法訪問//	son2.m_C = 4;
}// private 繼承
class Son3 : private base1{void fun(){m_A = 10; //變為privatem_B = 10; //變為private//m_C = 10; //私有權限無法繼承}
};
void test3(){Son3 son3;
//		son3.m_A = 2; //變為private,類外無法訪問//	son2.m_B = 3; //變為private,類外無法訪問//	son2.m_C = 4;
}
int main(){test1();test2();test3();return 0;
}

三、對象模型

父類當中的非靜態成員變量都會繼承下去,私有成員也會繼承,只是不能訪問

代碼示例

#include<iostream>
using namespace std;class per{
public:int m_A;
protected:int m_B;
private:int m_C;
};class son : public per{
public:int m_D;
};void test(){cout<<"sizeof(son)="<<sizeof(son)<<endl;
}int main(){test();
}

四、繼承中的構造與析構的順序

先構造父類,再構造子類。析構順序與構造順序相反

代碼示例

#include<iostream>
using namespace std;class Base{
public:Base(){cout<<"父類中的構造"<<endl;}~Base(){cout<<"父類中的析構"<<endl;}
};class Son : public Base{
public:Son(){cout<<"子類中的構造"<<endl;}~Son(){cout<<"子類中的析構"<<endl;}
};void test(){
//	Base b;Son s;
}
int main(){test();return 0;
}

五、繼承中同名成員處理

  • ?子類對象可以直接訪問到子類中的同名函數
  • 子類對象加作用域可以訪問到父類中的成員函數
  • 當子類與父類擁有同名的成員函數時,子類會隱藏父類中同名的成員函數,加作用域可以訪問到父類中的同名函數

非靜態成員變量與靜態成員變量處理方式一致,只不過靜態成員變量有兩種訪問方式:

  1. 通過對象進行訪問? ?例:s.fun();
  2. 通過類名進行訪問? ?例:Son::Base::fun();

?代碼示例

#include<iostream>
using namespace std;class Base{
public:Base(){m_A = 100;}void fun(){cout<<"Base 的 fun()"<<endl;}void fun(int ){cout<<"Base 的 fun(int)"<<endl;}int m_A;
};class Son : public Base{
public:Son(){m_A = 200;}void fun(){cout<<"Son 的 fun()"<<endl;}int m_A;};void test(){Son s;cout<<"m_A="<<s.m_A<<endl; //200cout<<"m_A="<<s.Base::m_A<<endl; //100,同名時,調用父類中的成員需要加作用域s.fun();s.Base::fun();s.Base::fun(1);  // 子類與父類擁有同名的成員函數時,子類會隱藏父類中所有版本的同名函數
}
int main(){test();return 0;
}

?六、多繼承語法

語法:class? 子類 :繼承方式 父類1 , 繼承方式? 父類2,...

?代碼示例

#include<iostream>
using namespace std;class Base1{
public:Base1(){m_A = 100;}int m_A;
};class Base2{
public:Base2(){m_A = 200;}int m_A;
};class son : public Base1,public Base2{
public:son(){m_B = 200;}int m_B;
};void test (){son s;cout<<"sizeof(s)"<<sizeof(s)<<endl;cout<<s.Base1::m_A<<endl; // 繼承中出現同名時需要+作用域cout<<s.Base2::m_A<<endl;
}
int main(){test();
}

?七、菱形繼承

?關鍵字:virtual

如下示例:加上virtual關鍵字后,Sleep和Tuo 兩個類里的m_Age 存的是 vbptr(虛基類指針),指向各自的 vbtable(虛基類列表)。從而直接拿到Animal 中的m_Age,解決SleepTuo 拿到兩份相同數據的問題。

代碼示例

#include<iostream>
using namespace std;class Animal{
public:int m_Age;
};// 當子類繼承兩份相同的數據時:
// 繼承前加上 virtual 關鍵字后,變為虛繼承
// 此時公共的父類 Animal 稱為虛基類
class Sleep : virtual public Animal{};
class tuo : virtual public Animal{};class SleepTuo : public Sleep , public tuo{};void test1(){SleepTuo y;y.Sleep::m_Age = 100;y.tuo::m_Age = 200;cout<<y.Sleep::m_Age<<endl;cout<<y.tuo::m_Age<<endl;cout<<y.m_Age<<endl;
}int main(){test1();
}

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

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

相關文章

Netty客戶端接收不到服務端發送的數據問題

文章目錄 前言問題描述相關代碼解決方法 前言 環境 JDK&#xff1a;64位 jdk1.8.0_201 Netty&#xff1a;4.1.39.Final 問題描述 項目中使用Netty接受客戶端的消息&#xff0c;客戶端為硬件設備&#xff0c;在接受數據后發送數據到服務端。 同時因為客戶端沒有聯網&#xff…

IDEA方法注釋模板設置

目錄 創建模板 新建模板&#xff1a;命名為* 設置模板內容-IDEA格式模板 設置模板應用場景 設置參數 創建模板 /**Enter這里我們也按照這種習慣來設置IDEA的方法注釋&#xff1a;File-->Settings-->Editor-->Live Templates 先新建模板組&#xff0c;然后在模板組中…

vscode 配置C/C++環境控制臺參數

您可以通過以下步驟在VS Code中配置C/C環境的控制臺參數&#xff1a; 1&#xff0c;打開VS Code并進入您的C/C項目 2&#xff0c;點擊左側的"調試"圖標&#xff0c;然后點擊頂部的齒輪圖標&#xff0c;選擇“launch.json”。 3&#xff0c;在"launch.json&qu…

深度學習筆記之BERT(五)TinyBERT

深度學習筆記之TinyBERT 引言回顧&#xff1a;DistilBERT模型TinyBERT模型結構TinyBERT模型策略Transformer層蒸餾嵌入層蒸餾預測層蒸餾 TinyBERT模型的訓練效果展示 引言 上一節介紹了 DistilBERT \text{DistilBERT} DistilBERT模型&#xff0c;本節將繼續介紹優化性更強的知…

正則表達式——參考視頻B站《奇樂編程學院》

智能指針 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替換&#x1f388;1.3. 數據驗證&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高級搜索功能 二、原料2.1 參考視頻2.2 驗證網址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…

appium學習之二:adb命令

1、查看設備 adb devices 2、連接 adb connect IP:端口 3、安裝 adb install xxx.apk 4、卸載 adb uninstall 【包名】 5、把對應目錄下的1.txt文件傳到手機sdcard下 adb push 1.txt /sdcard 6、進入對應的設備里 adb shell 7、切入sdcard目錄 cd /sdcard 8、ls 查…

Tablesaw封裝Plot.ly實現數據可視化

上文介紹tablesaw的數據處理功能&#xff0c;本文向你展示其數據可視化功能&#xff0c;并通過幾個常用圖表示例進行說明。 Plot.ly包裝 可視化是數據分析的重要組成部分&#xff0c;無論你只是“查看”新數據集還是驗證機器學習算法的結果。Tablesaw是一個開源、高性能的Java…

Python實現中國象棋

探索中國象棋 Python 代碼實現&#xff1a;從規則邏輯到游戲呈現 中國象棋&#xff0c;這款源遠流長的棋類游戲&#xff0c;承載著深厚的文化底蘊與策略智慧。如今&#xff0c;借助 Python 與 Pygame 庫&#xff0c;我們能夠在數字世界中復刻其魅力&#xff0c;深入探究代碼背后…

互聯網、物聯網的相關標準

互聯網的相關標準 網絡通信協議&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于在網絡中傳輸文本、圖像、音頻和視頻等數據的協議。它基于請求-響應模型&#xff0c;客戶端發送請求給服務器&#xff0c;服務器返回響應。HTTPS&a…

學習Ajax (概述,應用場景,使用jQury 實現ajax)

目錄 前言 概述 什么是Ajax? 同步交互與異步交互的區別是什么呢&#xff1f; 應用場景 場景1 在搜索框搜索 資源 場景2 登錄業務的對用戶名處理 AJAX的優缺點 優點&#xff1a; 缺點&#xff1a; 使用jQury 實現ajax 使用步驟 1 引入jQury 文件 2 使用Ajax 函數…

網迅通推出新一代智能家居拓展網關

Zigbee 型智能家居拓展網關 產品概述 A、概述 Zigbee 是一種短距離、低功耗的無線通信技術名稱。其特點是近距離、低復雜度、低功耗、低數據速率、低成本。ZigBee 模塊是一種物聯網無線數據終端&#xff0c;利用 ZigBee 網絡為用戶提供無線數據傳輸功能。該產品采用高性能的…

ArcGIS字符串補零與去零

我們有時候需要 對屬性表中字符串的補零與去零操作 我們下面直接視頻教學 下面看視頻教學 ArcGIS字符串去零與補零 推薦學習 ArcGIS全系列實戰視頻教程——9個單一課程組合 ArcGIS10.X入門實戰視頻教程&#xff08;GIS思維&#xff09; ArcGIS之模型構建器&#xff08;Mod…

NIFI使用

1 從Kafka接收消息&#xff0c;存儲到數據庫中。 &#xff08;1&#xff09; ConsumerKafka processor &#xff08;2&#xff09;Execute Scripts Processor 我這里是使用JS腳本進行處理。 還有很多其他語言的腳本。 var flowFile session.get(); if (flowFile ! null) {v…

linux系統使用nginx代理mysql數據庫

##使用nginx代理mysql數據庫 ##安裝nginx ./configure --prefix/home/yym/nginx/nginx-install/ --with-http_addition_module --with-http_realip_module --with-stream make && make install ##nginx配置文件 stream { upstream mysqlserver { serv…

kubeadm安裝K8s集群之高可用組件keepalived+nginx

系列文章目錄 1.kubeadm安裝K8s集群之基礎環境配置 2.kubeadm安裝K8s集群之高可用組件keepalivednginx 3.kubeadm安裝K8s集群之master節點加入 4.kubeadm安裝K8s集群之worker1節點加入 kubeadm安裝K8s集群之高可用組件keepalivednginx 1.安裝kubeadm、kubectl、kubelet2.安裝高…

子網劃分實例

看到有人問這個問題&#xff1a; 想了一下&#xff0c;這是一個子網劃分的問題&#xff1a; 處理方法如圖&#xff1a; 這是一個子網劃分的問題 設備1用三層交換機&#xff0c;端口設置為路由模式&#xff0c;設備2和設備3為傻瓜交換機模式 設備2和設備3下掛設備都是26為掩碼&…

【前端知識】微前端框架qiankun

微前端框架qiankun 簡介一、核心思想二、主要特性三、關鍵技術四、使用場景五、使用示例六、優勢與劣勢七、總結 使用一、創建主應用&#xff08;Angular CLI項目&#xff09;二、創建子應用&#xff08;Vue CLI項目&#xff09;三、啟動并測試 使用場景一、大型前端應用的拆分…

Ubuntu22.04深度學習環境安裝【Anaconda+Pycharm】

anaconda可以提供多個獨立的虛擬環境&#xff0c;方便我們學習深度學習&#xff08;比如復現論文&#xff09;&#xff1b; Pycharm編輯器可以高效的編寫python代碼&#xff0c;也是一個很不錯的工具。 下面就記錄下Ubuntu22.04的安裝流程&#xff1a; 1.Anaconda安裝 下載Ana…

Transformer圖解

前言 transformer是目前NLP甚至是整個深度學習領域不能不提到的框架&#xff0c;同時大部分LLM也是使用其進行訓練生成模型&#xff0c;所以transformer幾乎是目前每一個機器人開發者或者人工智能開發者不能越過的一個框架。接下來本文將從頂層往下去一步步掀開transformer的面…

網絡安全在數字時代保護庫存數據中的作用

如今&#xff0c;通過軟件管理庫存已成為一種標準做法。企業使用數字工具來跟蹤庫存水平、管理供應鏈和規劃財務。 然而&#xff0c;技術的便利性也帶來了網絡威脅的風險。黑客將庫存數據視為有價值的目標。保護這些數據不僅重要&#xff0c;而且必不可少。 了解網絡安全及其…