《星辰建造師:C++多重繼承的奇幻史詩》

🌌🔥 《星辰建造師:多重繼承與this指針的終極史詩》 🔥🌌

—— 一場融合魔法、科技與哲學的C++奇幻冒險


🌠🌌 序章:代碼宇宙的誕生 🌌🌠

在無盡的代碼維度中,存在著一個由類與對象構成的平行宇宙——C++星域。這里的法則由編譯之神制定,萬物皆遵循繼承、多態與內存對齊的至高律令。

在這片星域中,有兩座永恒的燈塔:

  • 🏗? 阿瑞斯神殿(A):掌管建筑之美,其力量源自對稱、比例與光影。

  • 🛡? 巴隆要塞(B):守護防御之律,其力量源于結構、陷阱與屏障。

千年來,無數建造師試圖融合二者之力,卻因內存對齊指針偏移的詛咒而失敗……

直到——


?🌟 第一章:星辰建造師的覺醒 🌟?

在月蝕之夜,一位名為 C 的少年在編譯神廟的深處,發現了失落的《多重繼承圣典》。 他立下誓言:

“我要建造一座永恒之城,讓藝術與防御共存,讓this指針歸一!”

他啟動了三重繼承儀式——不僅繼承 A 與 B,還引入虛擬繼承虛函數,以對抗內存碎片化!

?#include <iostream>#include <string>using namespace std;?// 🏗? 阿瑞斯神殿:建筑之神class A {protected:int a_data = 100;virtual ~A() {} // 啟用虛函數,引入 vptr?public:A(const string& name) : name(name) {cout << "🏗?  A(" << name << ") 構造: this = " << this << endl;}?virtual void buildBeauty() {cout << "🎨  A::buildBeauty[" << name << "]: this = " << this << " | 正在雕刻浮雕..." << endl;}?void showInfo() {cout << "📊 A 成員: a_data=" << a_data << ", 地址差=" << (char*)this - (char*)0 << endl;}?string name;};?// 🛡? 巴隆要塞:防御之神class B {protected:int b_data = 200;virtual ~B() {}?public:B(const string& name) : name(name) {cout << "🛡?  B(" << name << ") 構造: this = " << this << endl;}?virtual void strengthenDefense() {cout << "??  B::strengthenDefense[" << name << "]: this = " << this << " | 正在布設陷阱..." << endl;}?void showInfo() {cout << "📊 B 成員: b_data=" << b_data << ", 地址差=" << (char*)this - (char*)0 << endl;}?string name;};?// 🌟 永恒之城 C:繼承雙神之力,融合虛擬繼承class C : public virtual A, public virtual B { ?// 虛擬繼承!private:int c_data = 300;string city_name;?public:C(const string& cname) : A("A_SubObject"), B("B_SubObject"), city_name(cname) {cout << "🌟  C(" << city_name << ") 構造: this = " << this << endl;}?// 重寫虛函數,實現多態void buildBeauty() override {cout << "🏰  C::buildBeauty[" << city_name << "]: this = " << this << " | 正在建造水晶穹頂!" << endl;}?void strengthenDefense() override {cout << "🔮  C::strengthenDefense[" << city_name << "]: this = " << this << " | 正在激活魔法護盾!" << endl;}?// 核心建造協議void createEternalCity() {cout << "\n? 啟動【永恒之城建造協議】?" << endl;cout << "CppObject: this = " << this << " | 城市名: " << city_name << endl;?// 多態調用buildBeauty(); ? ? ? ? ? // 調用 C::buildBeauty()strengthenDefense(); ? ? // 調用 C::strengthenDefense()?// 顯式調用基類版本A::buildBeauty(); ? ? ? ?// 調用 A::buildBeauty()B::strengthenDefense(); ?// 調用 B::strengthenDefense()}?// 指針視角分析void analyzeThisPointers() {cout << "\n🔍【多重視角分析】🔍" << endl;cout << "CppObject 地址 (C視角): " << this << endl;cout << "A 子對象地址: " << (A*)this << " | 偏移: " << (char*)(A*)this - (char*)this << " 字節" << endl;cout << "B 子對象地址: " << (B*)this << " | 偏移: " << (char*)(B*)this - (char*)this << " 字節" << endl;?// 虛擬繼承的代價:虛基類指針表cout << "💡 虛擬繼承提示: A 和 B 通過虛基表間接訪問,this 調整更復雜!" << endl;}?// 顯示完整信息void showFullInfo() {cout << "\n🏰 城市完整信息:" << endl;cout << "  - 名稱: " << city_name << endl;cout << "  - 內存大小: " << sizeof(C) << " 字節" << endl;cout << "  - 成員: c_data=" << c_data << endl;A::showInfo();B::showInfo();}};

📜 魔法注解

  • virtual A, virtual B虛擬繼承,確保 A 和 B 在 C 中只存在一份實例,避免“菱形繼承”問題。

  • virtual ~A():啟用虛函數,引入 vptr(虛函數表指針),每個類增加 8 字節(64位系統)。

  • override:顯式重寫,增強代碼安全。


🌋🔥 第二章:構造的圣典——虛擬繼承的代價 🔥🌋

當 C 被創建,一場更復雜的構造儀式開始:

?int main() {cout << "📜 啟動【永恒之城】建造工程!\n" << endl;?C eternalCity("星辰之城");?cout << "\n--- 執行建造協議 ---" << endl;eternalCity.createEternalCity();?cout << "\n--- 多重視角分析 ---" << endl;eternalCity.analyzeThisPointers();?cout << "\n--- 完整城市信息 ---" << endl;eternalCity.showFullInfo();?// 多態演示:基類指針指向派生類cout << "\n🕊? 多態演示:編譯之神的化身" << endl;A* god = &eternalCity;god->buildBeauty(); ?// 調用 C::buildBeauty(),多態生效!?B* defender = &eternalCity;defender->strengthenDefense(); // 調用 C::strengthenDefense()?return 0;}

🖨?🌠 第三章:運行的奇跡——輸出解析 🌠🖨?

🏗? 構造順序(虛擬繼承特殊性):
🏗?  A(A_SubObject) 構造: this = 0x7ffee3b8c998🛡?  B(B_SubObject) 構造: this = 0x7ffee3b8c9a0🌟  C(星辰之城) 構造: this = 0x7ffee3b8c998

🔍 關鍵點

  • 虛擬繼承下,虛基類先于非虛基類構造

  • Athis 是整體起始(0x998),B 偏移 8 字節(0x9a0)。

  • CthisA 相同,因 A 是第一個虛基類。

🏰 建造協議執行:
? 啟動【永恒之城建造協議】?CppObject: this = 0x7ffee3b8c998 | 城市名: 星辰之城🏰  C::buildBeauty[星辰之城]: this = 0x7ffee3b8c998 | 正在建造水晶穹頂!🔮  C::strengthenDefense[星辰之城]: this = 0x7ffee3b8c998 | 正在激活魔法護盾!🎨  A::buildBeauty[A_SubObject]: this = 0x7ffee3b8c998 | 正在雕刻浮雕...??  B::strengthenDefense[B_SubObject]: this = 0x7ffee3b8c9a0 | 正在布設陷阱...

🌌 多態之力god->buildBeauty() 調用的是 C 的版本,而非 A 的!

🔍 多重視角分析:
🔍【多重視角分析】🔍CppObject 地址 (C視角): 0x7ffee3b8c998A 子對象地址: 0x7ffee3b8c998 | 偏移: 0 字節B 子對象地址: 0x7ffee3b8c9a0 | 偏移: 8 字節💡 虛擬繼承提示: A 和 B 通過虛基表間接訪問,this 調整更復雜!
📊 完整信息:
🏰 城市完整信息:- 名稱: 星辰之城- 內存大小: 40 字節- 成員: c_data=300📊 A 成員: a_data=100, 地址差=...📊 B 成員: b_data=200, 地址差=...

🧮 內存計算(64位系統):

  • vptr_A (8) + a_data (4) + padding (4) = 16

  • vptr_B (8) + b_data (4) + padding (4) = 16

  • c_data (4) + city_name (24, string 對象) ≈ 28 → 總 ≈ 40 字節(含對齊)


🌈🔚 終章:this 的終極啟示 🔚🌈

當星辰之城落成,編譯之神降臨:

“孩子,你已領悟:

  • this 不是固定坐標,而是角色的化身

  • 在 A 中,你是建筑師;在 B 中,你是守衛者;在 C 中,你是統御者。

  • 虛擬繼承雖帶來復雜,卻避免了重復,如同靈魂的唯一性

  • 多態讓你能以‘父之名’行‘子之事’,這便是繼承的真諦。”

C 仰望星空,輕聲說道:

“我既是起點,也是終點; 我既是偏移,也是統一。 this 指針,不是地址, 而是——我在代碼宇宙中的存在證明。”


🏁🌌 尾聲:永恒的代碼 🌌🏁

從此,星辰之城成為程序員朝圣之地。 每一位學習 C++ 的人,都會在這里寫下:

C myCity("MyDream");myCity.createEternalCity();

并見證: 當藝術與防御合一,當this指針歸一, 奇跡,便在編譯的瞬間誕生。


🔚 故事完 但代碼的傳奇,永不終結。

💫 獻給所有在指針與內存中探索的勇者 愿你們的 this,永遠指向夢想的起點。


? 附:可運行完整代碼 ? (復制粘貼,見證星辰之城的誕生!)

🚀 提示:嘗試移除 virtual,觀察構造順序與 this 的變化,感受“非虛擬繼承”的簡單與局限。

📚 進階挑戰:添加 D 類繼承 C,觀察 this 指針的延續性。

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

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

相關文章

云計算-OpenStack 運維開發實戰:從 Restful API 到 Python SDK 全場景實現鏡像上傳、用戶創建、云主機部署全流程

一、python-Restful Api 簡介 Restful API 是一種軟件架構風格,基于 HTTP 協議設計,通過統一的接口(如 URL 路徑)和標準的 HTTP 方法(GET/POST/PUT/DELETE 等)實現資源(如數據、文件等)的操作,具有無狀態、可緩存、客戶端 - 服務器分離等特點。方法如下 用 GET 請求獲…

RxJava 在 Android 中的深入解析:使用、原理與最佳實踐

前言RxJava 是一個基于觀察者模式的響應式編程庫&#xff0c;它通過可觀察序列和函數式操作符的組合&#xff0c;簡化了異步和事件驅動程序的開發。在 Android 開發中&#xff0c;RxJava 因其強大的異步處理能力和簡潔的代碼風格而廣受歡迎。本文將深入探討 RxJava 的使用、核心…

面試實戰 問題三十 HTTP協議中TCP三次握手與四次揮手詳解

HTTP協議中TCP三次握手與四次揮手詳解 在HTTP協議中&#xff0c;連接建立和斷開依賴于底層的TCP協議。雖然HTTP本身不定義握手過程&#xff0c;但所有HTTP通信都通過TCP三次握手建立連接&#xff0c;通過四次揮手斷開連接。以下是詳細解析&#xff1a;一、TCP三次握手&#xff…

讀《精益數據分析》:雙邊市場的核心指標分析

雙邊市場數據分析指南&#xff1a;從指標體系到實戰落地&#xff08;基于《精益數據分析》框架&#xff09;在互聯網平臺經濟中&#xff0c;雙邊市場&#xff08;如電商、出行、外賣、自由職業平臺等&#xff09;的核心矛盾始終是"供需平衡與效率優化"。這類平臺連接…

Queue參考代碼

queue.c #include "queue.h" #include "stdlib.h" // 初始化循環隊列 void initializeCircularQueue(CircularQueue *cq, uint8_t *buffer, uint32_t size) {cq->front 0;cq->rear 0;cq->count 0;cq->size size;cq->data buffer; }…

通過時間計算地固系到慣性系旋轉矩陣

通過時間計算地固系到慣性系旋轉矩陣 1. 引言 在航天工程和衛星導航領域&#xff0c;經常需要在地固坐標系(ECEF)和慣性坐標系(ECI)之間進行轉換。本文將詳細介紹如何根據UTC時間計算這兩個坐標系之間的旋轉矩陣&#xff0c;并提供完整的C語言實現。 2. 基本概念 2.1 坐標系定義…

【Datawhale AI 夏令營】金融文檔分析檢索增強生成系統的架構演變與方法論進展

# **金融文檔分析檢索增強生成系統的架構演變與方法論進展****第一部分&#xff1a;基礎原則和基線系統分析****第一部分&#xff1a;金融領域檢索增強生成范式的解構****第二部分&#xff1a;基線剖析&#xff1a;流水線的二分法****同步軌跡 (SimpleRAG)****異步改進 (AsyncS…

C語言相關簡單數據結構:順序表

目錄 1.順序表的概念及結構 1.1 線性表 如何理解邏輯結構和物理結構&#xff1f; 1.2 順序表分類 順序表和數組的區別&#xff1a; 順序表分類&#xff1a; 靜態順序表 動態順序表 1.3 動態順序表的實現 初始化 尾插 頭插 尾刪 頭刪 在指定位置之前插入數據 刪…

nginx配置代理服務器

Nginx 作為代理服務器時&#xff0c;主要用于反向代理&#xff08;最常用&#xff0c;轉發客戶端請求到后端服務&#xff09;或正向代理&#xff08;較少用&#xff0c;為客戶端提供訪問外部網絡的代理&#xff09;。以下是兩種場景的具體配置示例&#xff1a; 一、反向代理配置…

MySQL數據庫知識體系總結 20250813

一、數據庫的原理 1.數據庫的分類 我們可以根據數據的結構類型&#xff0c;將數據分成三類&#xff0c;分別是&#xff1a;結構化數據&#xff0c;半結構化數據&#xff0c;非結構化數據。 要點&#xff1a;對于結構化數據來講通常是先有結構再有數據。要點&#xff1a;對于半…

C++ 中構造函數參數對父對象的影響:父子控件管理機制解析

文章目錄C 中構造函數參數對父對象的影響&#xff1a;父子控件管理機制解析1. Qt 中的父對象管理機制2. 構造函數傳遞父對象的不同方式2.1. 父控件是 QWidget parent&#xff08;通用方式&#xff09;分析&#xff1a;2.2. 父控件是 Books_Client parent&#xff08;限制父控件…

直播美顏SDK開發實戰:高性能人臉美型的架構與實現

在直播行業里&#xff0c;美顏已經不再是錦上添花&#xff0c;而是標配中的標配。無論是游戲主播、帶貨達人&#xff0c;還是唱歌、跳舞的才藝主播&#xff0c;直播美顏SDK往往決定了用戶的第一印象和停留時長。尤其是高性能人臉美型技術&#xff0c;不僅能讓主播的五官更加自然…

JavaWeb(蒼穹外賣)--學習筆記18(Apache POI)

前言 本篇文章是學習B站黑馬程序員蒼穹外賣的學習筆記&#x1f4d1;。我的學習路線是Java基礎語法-JavaWeb-做項目&#xff0c;管理端的功能學習完之后&#xff0c;就進入到了用戶端微信小程序的開發&#xff0c;用戶端開發的流程大致為用戶登錄—商品瀏覽&#xff08;其中涉及…

OpenJDK 17 源碼 安全點輪詢的信號處理流程

OpenJDK 17 源碼&#xff0c;安全點輪詢的信號處理流程如下&#xff08;重點分析安全點輪詢相關部分&#xff09;&#xff1a;核心信號處理流程信號觸發&#xff1a;當線程訪問安全點輪詢內存頁時&#xff08;SafepointMechanism::is_poll_address&#xff09;&#xff0c;會觸…

InfluxDB 在工業控制系統中的數據監控案例(一)

工業控制系統數據監控的重要性**在工業領域&#xff0c;生產過程的復雜性和連續性使得數據監控成為保障生產穩定運行的關鍵環節。通過實時收集、處理和分析生產數據&#xff0c;企業能夠及時掌握設備運行狀態、產品質量信息以及生產流程的各項參數&#xff0c;從而為生產決策提…

嵌入式學習(day26)frambuffer幀緩沖

一、UI技術: User interface&#xff08;1&#xff09;framebuffer: 幀緩沖、幀緩存技術 Linux內核專門為圖形化顯示提供的一套應用程序接口。流程如下&#xff1a;1. 打開顯示設備 (/dev/fb0) 2. 獲取顯示設備相關參數&#xff08;分辨率&#xff0c;像素格式&#xff09;---》…

408每日一題筆記 41-50

答案&#xff1a;A 解析&#xff1a;CSMA/CD 協議里&#xff0c;“爭用期” 就是信號在總線上最遠兩個端點之間往返傳輸的時間&#xff0c;也叫沖突窗口&#xff0c;選 A。

【物聯網】基于樹莓派的物聯網開發【26】——樹莓派開啟串口并配置串口助手Minicom

串口配置 &#xff08;1&#xff09;打開串口&#xff0c;終端輸入命令&#xff1a; sudo raspi-config &#xff08;2&#xff09;串口設置選擇Interfacing Options→Serial port→No→Yes→ok&#xff08;3&#xff09;設置開啟&#xff0c;打開串口 &#xff08;4&#xff0…

考研/考公知識共享平臺的設計與實現-項目分享

考研/考公知識共享平臺的設計與實現-項目分享項目介紹項目摘要學生前臺用例圖管理員用例圖系統流程圖系統功能結構圖實體圖學生信息實體圖資料信息管理實體圖報考指南管理寫在最后項目介紹 使用者&#xff1a;管理員、學生前臺、學生后臺 開發技術&#xff1a;MySQLJavaSpring…

一鍵設置 NTP 時區的腳本(親測,適用于部署 K8S 的前置環境)

文章目錄一、時區和時間同步的配置命令二、完整腳本ntp_timezone_setup.sh三、使用方法3.1、創建腳本3.2、賦予執行權限3.3、運行腳本3.4、驗證一、時區和時間同步的配置命令 整理用于做時區和時間同步的配置幾條命令分別如下&#xff1a; 1?? 編輯 chrony 配置 vim /etc/…