【C++】:繼承[下篇](友元靜態成員菱形繼承菱形虛擬繼承)

目錄

  • 一,繼承與友元
  • 二,繼承與靜態成員
  • 三,復雜的菱形繼承及菱形虛擬繼承
  • 四,繼承的總結和反思

點擊跳轉上一篇文章: 【C++】:繼承(定義&&賦值兼容轉換&&作用域&&派生類的默認成員函數)

一,繼承與友元

友元關系不能繼承,也就是說基類友元不能訪問子類私有和保護成員 。

二,繼承與靜態成員

基類定義了static靜態成員,則整個繼承體系里面只有一個這樣的成員。無論派生出多少個子類,都只有一個static成員實例 。

class Person
{
public:Person() { ++_count; }
protected:string _name; // 姓名
public:static int _count; // 統計人的個數。
};int Person::_count = 0;class Student : public Person
{
protected:int _stuNum; // 學號
};int main()
{Person p;Student s;cout << &Person::_count << endl;cout << &Student::_count << endl;return 0;
}

在上述代碼中,此時Student和Person里面的_count是同一個,靜態變量_count存在靜態區,不是單獨的存在各個對象里,是屬于整個繼承體系了

三,復雜的菱形繼承及菱形虛擬繼承

1.單繼承:一個子類只有一個直接父類時稱這個繼承關系為單繼承。

在這里插入圖片描述

2.多繼承:一個子類有兩個或以上直接父類時稱這個繼承關系為多繼承。

在這里插入圖片描述
3.菱形繼承:菱形繼承是多繼承的一種特殊情況。

在這里插入圖片描述

菱形繼承的問題:從下面的對象成員模型構造,可以看出菱形繼承有數據冗余和二義性的問題

class Person
{
public:string _name; // 姓名int _id;int _tel;string _adress;
};class Student : public Person
{
protected:int _num; //學號
};class Teacher : public Person
{
protected:int _id; // 職工編號
};class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修課程
};int main()
{//數據冗余和二義性Assistant a;//a._name = "小李";//a._name = "李老師";//1.指定類域a.Student::_name = "小李";a.Teacher::_name = "李老師";
}

由監視窗口得出數據的冗余:
在Assistant的對象中Person成員會有兩份

在這里插入圖片描述

并且在訪問成員變量時指定不明確,有二義性

在這里插入圖片描述

4.解決方法

4.1 訪問成員變量有二義性時,可指定類域

int main()
{//繼承代碼續接上……//1.指定類域a.Student::_name = "小李";a.Teacher::_name = "李老師";
}

在這里插入圖片描述

4.2 虛擬繼承可以解決菱形繼承的二義性和數據冗余的問題

虛擬繼承:在繼承會造成冗余的類的那里加上關鍵字 virtual

class Person
{
public:string _name; // 姓名int _id;int _tel;string _adress;
};class Student : virtual public Person
{
protected:int _num; //學號
};class Teacher : virtual public Person
{
protected:int _id; // 職工編號
};class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修課程
};int main()
{Assistant a;a.Student::_name = "小李";a._name = "小李";a._name = "李老師";return 0;
}

四,繼承的總結和反思

1.很多人說C++語法復雜,其實多繼承就是一個體現。有了多繼承,就存在菱形繼承,有了菱形繼承就有菱形虛擬繼承,底層實現就很復雜。

2.多繼承可以認為是C++的缺陷之一,很多后來的OO語言都沒有多繼承,如Java。

3.繼承和組合

(1) public繼承是一種is-a的關系。也就是說每個派生類對象都是一個基類對象。

(2) 組合是一種has-a的關系。假設B組合了A,每個B對象中都有一個A對象。

(3) 優先使用對象組合,而不是類繼承

(4) 繼承可以直接訪問基類的protected 和 public成員。在繼承方式中,基類的,內部細節對子類可見 。繼承一定程度破壞了基類的封裝,類的改變,對派生類有很大的影響。派生類和基類間的依賴關系很強,耦合度高

(5) 組合只能訪問public成員組合類之間沒有很強的依賴關系,耦合度低。優先使用對象組合有助于你保持每個類被封裝。

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

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

相關文章

MATLAB Gazebo聯合仿真

準備仿真環境&#xff1a;在Gazebo中設置仿真場景&#xff0c;包括機器人模型、環境布局、傳感器和執行器等。編寫MATLAB腳本&#xff1a;在MATLAB中編寫控制算法和數據處理腳本&#xff0c;用于接收Gazebo中的傳感器數據&#xff0c;并生成控制命令。建立通信&#xff1a;通過…

DEBUG:jeston卡 遠程ssh編程

問題 jeston 打開網頁 gpt都不方便 而且只需要敲命令就行 解決 下載MobaXterm(window執行) liunx需要虛擬機 軟件 遠程快速復制命令

PHP文字ocr識別接口示例、人工智能的發展

全球在人工智能升級的大背景下&#xff0c;有一定規模的制造商開始大量部署人工智能機器人、系統&#xff0c;以此取代危險、簡單和重復性的工作。各種人工智能技術的迅猛發展&#xff0c;正在驅動各行業就業市場發現變革。 京東物流大家并不陌生&#xff0c;京東快遞機器人在…

vue中table內容和lable對不齊解決方案

問題&#xff1a; 代碼片段&#xff1a; <template><el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"title" label"標題" width"80px" /><el-table-column prop"n…

Windows安全日志導致環境內存占用過高

Windows 環境內存占用高不釋放&#xff0c;目前遇到的常見情況如下&#xff1a; 情況一&#xff1a;JVM內存泄漏 這種網上的排查方式有很多&#xff0c;自行查閱即可 情況二&#xff1a;SQLserver內存配置過大 這種也是&#xff0c;從網上查找修改方式然后修改即可 情況三…

python的面向對象編程

為什么要面向對象編程&#xff1f; 偉大的領袖毛澤東曾說過&#xff1a;編程最大的敵人是重復。 最開始&#xff0c;在程序中寫的一條條語句&#xff0c;在執行的時候會變成一條條指令交給CPU執行。這就是**“程序是指令的集合”** 。為了簡化程序的設計&#xff0c;引入了函數…

WebPages 全局:深入解析現代網頁設計與開發

WebPages 全局:深入解析現代網頁設計與開發 引言 隨著互聯網技術的飛速發展,網頁設計與開發已經成為了數字化時代的重要組成部分。從簡單的文本和圖像展示,到如今復雜的多媒體交互體驗,網頁設計經歷了翻天覆地的變化。本文將深入探討WebPages全局,包括網頁設計的基本概念…

Defensor 4.5:構建數據資產為中心的安全運營體系

5月31日“向星力”未來數據技術峰會上&#xff0c;星環科技重磅發布數據安全管理平臺 Defensor 4.5版本。新版本引入了以數據資產為中心的數據安全運營體系&#xff0c;通過智能化大模型技術&#xff0c;幫助企業快速、精準地識別核心重要資產&#xff1b;建設全局的數據安全策…

pytorch GPU cuda 使用 報錯 整理

GPU 使用、報錯整理 1. 使用指定GPU&#xff08;單卡&#xff09;1.1 方法1&#xff1a;os.environ[CUDA_VISIBLE_DEVICES]1.2 方法2&#xff1a;torch.device(cuda:2)1.3 報錯1&#xff1a;RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asy…

MySQL學習記錄 —— ?? 常用程序和配置文件

文章目錄 1、mysqld2、mysql常用命令介紹 3、配置文件語法 1、mysqld mysqld就是MySQL服務器&#xff0c;是一個多線程程序。對數據目錄&#xff0c;即mysql的主要工作目錄進行訪問管理。當mysqld啟動時&#xff0c;會偵聽指定的端口&#xff0c;處理來自客戶端程序的網絡連接…

【vue教程】二. Vue特性原理詳解

目錄 回顧本章涵蓋知識點Vue 實例和選項創建 Vue 實例Vue 實例的選項 Vue 模板語法插值表達式指令v-bindv-modelv-on 自定義指令創建自定義指令在模板中使用自定義指令自定義指令的鉤子函數自定義指令的實例演示 指令注冊局部注冊指令過濾器 數據綁定和響應式原理響應式數據綁定…

Oracle邏輯備份

邏輯備份 expdp 備份恢復表空間 創建測試數據 # 創建表空間 create tablespace itpux01 datafile /oradata/fghsdb/itpux01.dbf size 100m autoextend off extent management local autoallocate segment space management auto; create tablespace itpux02 datafile /o…

編程題目積累(day5)

題目&#xff1a; 源數組a&#xff0c;將a中所有元素乘以2之后添加進a&#xff0c;則這個a就叫雙倍數組&#xff0c;給你一個數組a&#xff0c;判斷它是不是雙倍數組&#xff0c;如果是則輸出源數組&#xff0c;不是則輸出空數組。 補充知識&#xff1a; python中枚舉和字典…

OAuth 和 SSO 場景中的 URL 語法解析

OAuth 和 SSO 場景中的 URL 語法解析 在 OAuth 和 SSO (Single Sign-On) 場景中&#xff0c;URL 是一個關鍵組件&#xff0c;用于在客戶端和服務器之間傳遞認證請求和響應。讓我們深入解析這個 URL&#xff1a; https://api.commerce.ondemand.com/occ/oauth/authorize?resp…

【python數據結構精講】雙端隊列

通過總結《流暢的Python》等書中的知識&#xff0c;總結Python中常用工具的方法。 deque&#xff0c;學名雙端隊列。 1. 常用方法 append()&#xff1a;隊列尾部添加appendleft()&#xff1a;隊首添加pop()&#xff1a;移除隊列最后一個元素popleft()&#xff1a;移除隊列第一…

AI算法14-套索回歸算法Lasso Regression | LR

套索回歸算法概述 套索回歸算法簡介 在統計學和機器學習中&#xff0c;套索回歸是一種同時進行特征選擇和正則化&#xff08;數學&#xff09;的回歸分析方法&#xff0c;旨在增強統計模型的預測準確性和可解釋性&#xff0c; 正則化是一種回歸的形式&#xff0c;它將系數估…

并發編程-06之Semaphore

一 Semaphore入門 1.1 什么是Semaphore Semaphore&#xff0c;俗稱信號量&#xff0c;它是操作系統中PV操作的原語在java的實現&#xff0c;它也是基于AbstractQueuedSynchronizer實現的。 Semaphore的功能非常強大&#xff0c;大小為1的信號量就類似于互斥鎖&#xff0c;通過同…

centos部署jar包

第一步&#xff1a; 將IDEA中的項目打包為jar,將這個jar文件放到centos服務器上的目錄里&#xff0c;我在opt新建api目錄&#xff0c;將jar文件放入&#xff0c;如下圖&#xff1a; 第二步&#xff1a; 將需要讀取的配置文件也放入此目錄(其他目錄也可以&#xff0c;和腳本中…

【筆記】記一次讀寫分離之shardingsphere.datasource導致數據源為空錯誤

錯誤&#xff1a; *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. Reason: Failed to determin…

搭建RAG系統就這么簡單:LangChain|RAG是什么?

RAG是什么 “RAG”&#xff08;Retrieval-Augmented Generation&#xff09;是一種結合了檢索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的人工智能技術&#xff0c;它在大模型中被需要的原因包括&#xff1a; 知識豐富性&#xff1a; 大模…