【DeepSeek 學c++】dynamic_cast 原理

用于向下轉化。 父類引用指向指類對象

假設父親是a, 子類是b.
B* pb = new B; 子類對象
A* pa 父類引用指向子類對象,
那么向上轉化 Apa = pb 這個是自動完成的,隱式轉化,不需要dynamic_cast
向下轉化指的是
A
pa = new B。 這個是指向子類對象的父類引用, 轉化為子類引用
B *b = dynamic_cast<B*>(pa)
總結就是 父類 向下轉化為子類, 但是父類指針本身是指向子類的。
而不是說指向父類的指針轉化為指向子類的指針,這個是無法轉的。

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

在這里插入圖片描述

2. 舉例說明用法

首先,類X和類A都是基類,各自有虛析構函數。然后,類B公有繼承自A,類C公有繼承自B,所以C的繼承鏈是C→B→A。接著,類D公有繼承自X和C,也就是多重繼承,D的基類是X和C,而C又繼承自B和A。因此,D的繼承結構應該是D同時繼承X和C,而C又繼承B和A。所以D的完整繼承鏈是D→X,D→C→B→A。

現在來看各個選項:

選項A:D* pd = new D; A* pa = dynamic_cast<A*>(pd);
這里pd是D類型的指針,轉換為A*。因為D繼承自C,而C繼承自B和A,所以D是A的派生類。因此,從D到A是上行轉換(upcast),這種轉換是安全的,不需要dynamic_cast,直接隱式轉換即可**(父類引用指向子類對象,安全的,直接隱式轉化)**。但即使使用dynamic_cast,結果也是有效的,pa會指向D對象中的A子對象部分。所以選項A的轉換是合法的,結果成功。

選項B:B* pb = new B; D* pd = dynamic_cast<D*>(pb);
這里pb是B類型的指針,嘗試轉換為D*。因為D繼承自C,而C繼承自B,所以D是B的派生類。但pb實際指向的是B對象,而不是D對象。dynamic_cast在下行轉換(downcast)時,會檢查對象的實際類型是否為目標類型。由于pb指向的是B對象,而不是D對象,所以轉換失敗,返回nullptr。因此選項B的轉換是合法的,但結果失敗,pd為nullptr。

選項C:A* pa = new D; X* px = dynamic_cast<X*>(pa);
pa是一個指向D對象的A指針。D繼承自X和C,而C繼承自B和A。因此,D對象中包含X和A的子對象。這里要將A轉換為X。由于A和X之間沒有直接的繼承關系,但因為D同時繼承了X和C(而C繼承自A),所以D對象中包含X和A的子對象。dynamic_cast在這種情況下,可以進行跨基類的轉換,前提是兩個基類都在同一個對象中。這里,pa指向的是D對象的A子對象,要轉換到X子對象,需要通過D的類型信息。由于D確實繼承自X,所以dynamic_cast應該可以找到X的子對象,轉換成功。因此選項C的轉換是合法的,結果成功,px指向D對象的X子對象。

選項D:A* pa = new C; C* pc = dynamic_cast<C*>(pa);
pa是一個指向C對象的A指針。因為C是A的派生類(C→B→A),所以這里從A到C是下行轉換。由于pa實際指向的是C對象,dynamic_cast會檢查類型是否匹配。因為C確實是A的派生類,所以轉換成功,pc指向原來的C對象。所以選項D的轉換是合法的,結果成功。

不過,我需要再仔細檢查選項D的描述是否正確。實際上,C是A的派生類,所以存在繼承關系。因此,選項D的dynamic_cast是合法的,且轉換成功。

3. 原理說明:A* pa = new D; X* px = dynamic_cast<X*>(pa); 通過畫出內存布局來解釋,為什么可以使用轉化

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

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

B* pb = new B; D* pd = dynamic_cast<D*>(pb); 通過內存布局分析這個為甚不可以轉化

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

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

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

相關文章

c++ 數組索引越界檢查

用 c 編寫了一些程序&#xff0c;發現 c 不會自動檢查數組的索引越界問題。有時候程序運行錯誤&#xff0c;提示的錯誤信息莫名其妙&#xff0c;但很可能是某個數組越界的問題。 例如&#xff1a; #include <iostream>int main() {double arr[5] {1.1, 2.2, 3.3, 4.4,…

Touch Diver:Weart為XR和機器人遙操作專屬設計的觸覺反饋動捕手套

在虛擬現實&#xff08;VR&#xff09;和擴展現實&#xff08;XR&#xff09;領域&#xff0c;觸覺反饋技術正逐漸成為提升沉浸感和交互體驗的重要因素。Weart作為這一領域的創新者&#xff0c;憑借其TouchDIVER Pro和TouchDIVER G1觸覺手套&#xff0c;為用戶帶來了高度逼真的…

基于deepseek的智能語音客服【第二講】后端異步接口調用封裝

本篇內容主要講前端請求&#xff08;不包含&#xff09;訪問后端服務接口&#xff0c;接口通過檢索知識庫&#xff0c;封裝提示詞&#xff0c;調用deepseek的&#xff0c;并返回給前端的全過程&#xff0c;非完整代碼&#xff0c;不可直接運行。 1.基于servlet封裝異步請求 為…

歸并排序的思路與實現

歸并排序主要是兩大模塊 分治 和 合并 即將已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每個子序列有序&#xff0c;再使子序列段間有序。若將兩個有序表合并成一個有序表&#xff0c;稱為二路歸并 由于使用了新的數組 那么空間復雜度就為O(n) 但這…

Word中公式自動標號帶章節編號

&#xff08;1&#xff09;插入一行三列的表格&#xff0c;設置寬度分別為0.5&#xff0c;13.39和1.5&#xff0c;設置縱向居中&#xff0c;中間列居中對齊&#xff0c;最右側列靠右對齊&#xff0c;設置段落如下 &#xff08;2&#xff09;插入域代碼 【Word】利用域代碼快速實…

阿里云服務器環境部署 四 MySQL主從配置

安裝MySQL 導入mysql鏡像 docker load -i /opt/dockerinstall/mysql/mysql-8.1.0.tar docker run --privilegedtrue --name mysql8 --restartunless-stopped -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/d…

[RH342]iscsi配置與排錯

[RH342]iscsi配置與排錯 1. 服務端配置1.1 安裝targetcli1.2 準備磁盤1.3 服務端配置1.4 防火墻配置 2. 客戶端配置2.1 安裝客戶端軟件2.2 配置客戶端2.3 連接登錄服務端2.4 掛載使用 3. 安全驗證擴展3.1 服務端3.2 客戶端 4. 常見的排錯點4.1 服務端常見錯誤4.2 客戶端常見錯誤…

服裝零售行業數字化時代的業務與IT轉型規劃P111(111頁PPT)(文末有下載方式)

服裝零售行業數字化時代的業務與IT轉型規劃P111 詳細資料請看本解讀文章的最后內容。 隨著數字化技術的迅猛發展&#xff0c;服裝零售行業正經歷著前所未有的變革。本文將對《服裝零售行業數字化時代的業務與IT轉型規劃P111》進行詳細解讀&#xff0c;探討未來幾年內該行業的…

基于javaweb的SSM+Maven寵物領養寵物商城流浪動物管理系統與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

PostgreSQL 數據庫中導入大量數據

在 PostgreSQL 數據庫中導入大量數據,可根據數據來源和格式選擇不同的方法。以下為你詳細介紹幾種常見的方式: 1. 使用 COPY 命令(適用于本地數據文件) COPY 命令是 PostgreSQL 內置的高效數據導入工具,適合處理本地的數據文件。 步驟 準備數據文件 確保你的數據文件格…

C++語法之命名空間二

A.h頭文件中代碼&#xff1a; namespace a {void 輸出(); }; A.cpp源文件中代碼&#xff1a; #include <iostream> #include "A.h" void a::輸出() {std::cout << "A.h里的輸出函數" << std::endl; } B.h頭文件中代碼&#xff1a; …

基于FPGA的DDS連續FFT 仿真驗證

基于FPGA的 DDS連續FFT 仿真驗證 1 摘要 本文聚焦 AMD LogiCORE IP Fast Fourier Transform (FFT) 核心,深入剖析其在 FPGA 設計中的應用。該 FFT 核心基于 Cooley - Tukey 算法,具備豐富特性,如支持多種數據精度、算術類型及靈活的運行時配置。文中詳細介紹了其架構選項、…

美團Leaf分布式ID生成器使用教程:號段模式與Snowflake模式詳解

引言 在分布式系統中&#xff0c;生成全局唯一ID是核心需求之一。美團開源的Leaf提供了兩種分布式ID生成方案&#xff1a;號段模式&#xff08;高可用、依賴數據庫&#xff09;和Snowflake模式&#xff08;高性能、去中心化&#xff09;。本文將手把手教你如何配置和使用這兩種…

Swift 并發任務的協作式取消

在 Swift 并發&#xff08;Swift Concurrency&#xff09;中&#xff0c;任務&#xff08;Task&#xff09;不會被強行終止&#xff0c;而是采用**協作式取消&#xff08;cooperative cancellation&#xff09;**機制。這意味著任務會被標記為“已取消”&#xff0c;但是否真正…

大數據(1.1)紐約出租車大數據分析實戰:從Hadoop到Azkaban的全鏈路解析與優化

目錄 一、背景與數據價值? ?二、技術選型與組件分工? ?三、數據準備與預處理? 四、實戰步驟詳解? ?1. 數據上傳至HDFS ?2. Hive數據建模與清洗? 4?.2.1 建表語句&#xff08;分區表按年份&#xff09;?&#xff1a; ?4?.2.2 數據清洗&#xff08;剔除無效…

代碼隨想錄刷題day50|(回溯算法篇)131.分割回文串▲

目錄 一、回溯算法基礎知識 二、分割回文串思路 2.1 如何切割 2.2 判斷回文 2.3 回溯三部曲 2.4 其他問題 三、相關算法題目 四、總結 一、回溯算法基礎知識 詳見&#xff1a;代碼隨想錄刷題day46|&#xff08;回溯算法篇&#xff09;77.組合-CSDN博客 二、分割回文…

VS Code PowerShell、Windows PowerShell、CMD 的區別與聯系

VS Code PowerShell、Windows PowerShell、CMD 的區別與聯系? VS Code PowerShell、Windows PowerShell、CMD 的區別與聯系&#xff1a; 一、核心概念對比 名稱 全稱 類型 定位 VS Code PowerShell Visual Studio Code PowerShell 代碼編輯器集成終端 開發/腳本編寫…

關于Unity的CanvasRenderer報錯

MissingReferenceException: The object of type ‘CanvasRenderer’ has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEngine.UI.GraphicRaycaster.Raycast (UnityEng…

C++編譯流程

編譯器其實就是一個翻譯器&#xff0c;把我們的文件內容翻譯成機器能夠看懂的指令&#xff0c;但如何合理翻譯是核心。 C語言編譯 需要經過以下幾步&#xff1a; 詞法分析&#xff1a;掃描代碼&#xff0c;確定單詞類型&#xff0c;比如是變量還是函數&#xff0c;是標識符還…

python學智能算法(八)|決策樹

【1】引言 前序學習進程中&#xff0c;已經對KNN鄰近算法有了探索&#xff0c;相關文章鏈接為&#xff1a; python學智能算法&#xff08;七&#xff09;|KNN鄰近算法-CSDN博客 但KNN鄰近算法有一個特點是&#xff1a;它在分類的時候&#xff0c;不能知曉每個類別內事物的具…