C++ 詳談繼承體系下的構造函數和析構函數

前言

前面呢, 我們說了C++中實現多態的原理, 其中也說了, 虛函數表和虛函數指針的創建時機,?C++ 詳談多態實現原理-CSDN博客?, 這一節呢, 我們會說說在C++中繼承體系下的另一個知識點, 那就是:?繼承體系下的構造函數和析構函數~~, 主要圍繞兩個問題: 執行順序? 虛析構函數的作用??

繼承體系下的構造函數和析構函數的執行順序

首先我們用一句話來概括, 之后再做詳細解釋: 繼承下, 構造函數按照依賴鏈(孩子依賴父親), 從上往下構造, 析構函數按照依賴鏈, 從下向上析構.

我們從兩個角度來探討, 單繼承 和 多繼承.

單繼承

我們現在在前面代碼的基礎上添加兩個類, Base1和Drive1, Base1作為Base類中的成員變量, Drive1作為Drive中的成員變量, 我們可以設想一些這個情況下的調用順序, 構造Drive之前要先構造Base 和 構造Drive1, 構造Base之前要先構造Base1, 所以其構造順序應該是: Base1, Base, Drive1, Drive, 其析構順序應該是: Drive, Drive1, Base, Base1

#include <iostream>using namespace std;class Base1
{
public:Base1(){cout << "Base1 construction" << endl;}~Base1(){cout << "Base1 destruction" << endl;}
};
class Drive1
{
public:Drive1(){cout << "Drive1 construction" << endl;}~Drive1(){cout << "Drive1 destruction" << endl;}
};
class Base
{
public:Base(){cout << "Base construction" << endl;}~Base(){cout << "Base destruction" << endl;}
private:Base1 b1;
};
class Drive : public Base
{
public:Drive(){cout << "Drive construction" << endl;}~Drive(){cout << "Drive destruction" << endl;}
private:Drive1 d1;
};
int main()
{Drive d;cout << "------------------" << endl;return 0;
}

成員類按照順序構造, 優先于類的構造, 按照相反順序析構.?

多繼承

現在, 代碼有 一個MBase1和MBase2, 一個MDrive多繼承自MBase1和MBase2, 并且MDrive中還有成員變量, MDrive1和MDrive2類型的變量, 構造順序是繼承的順序

#include <iostream>using namespace std;class MBase1
{
public:MBase1(){cout << "MBase1 construction" << endl;}~MBase(){cout << "MBase1 destruction" << endl;}
};
class MBase2
{
public:MBase2(){cout << "MBase2 construction" << endl;}~MBase2(){cout << "MBase2 destruction" << endl;}
};
class MDrive1
{
public:MDrive1(){cout << "MDrive1construction" << endl;}~MDrive1(){cout << "MDrive1destruction" << endl;}
};
class MDrive2
{
public:MDrive2(){cout << "MDrive2 construction" << endl;}~MBase(){cout << "MDrive2 destruction" << endl;}
};
class MDrive : public MBase1, MBase2
{
public:MDrive(){cout << "MDrive construction" << endl;}~MDrive(){cout << "MDrive destruction" << endl;}
private:MDrive1 md1;MDrive2 md2;
};
int main()
{MDrive md;cout << "------------------" << endl;return 0;
}

多繼承中, 除了前面單繼承中的構造順序, 基類是聲明順序構造, 相反順序析構, 上面這一段代碼就是, 先構造MBase1, 再構造MBase2, 再構造MDrive1和MDirve2, 最后構造MDrive.

虛析構函數的作用

作用: 在繼承下, 為了使子類析構函數能夠得到正常調用, 需要將基類的析構函數設置為虛析構函數.

?C++中, 當一個類要被作為基類被繼承是, 應該將這個基類的析構函數手動設置為虛析構函數, 之前說過, C++中如果一個方法是virtual修飾的, 那么在子類繼承之后重寫這個方法, 也是virtual修飾的, C++會將所有的析構函數名稱修改成同一個.

這樣如果父類的析構函數是虛析構函數, 子類中一定是有同名的虛的析構函數, 這樣經過兩次vptr的賦值, 就能正常的調用到虛構造函數了~~

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

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

相關文章

PostgreSQL 字段類型速查與 Java 枚舉映射

1. 查詢 SQLSELECTc.table_schema,c.table_name,c.column_name,c.data_type,c.udt_name,CASE-- 數值WHEN c.udt_name IN (int2,int4,int8,float4,float8,numeric,money)THEN NUMERIC-- 布爾WHEN c.udt_name boolTHEN BOOLEAN-- 日期/時間WHEN c.udt_name IN (date,time,timetz…

數據分析綜合應用 30分鐘精通計劃

?? 數據分析綜合應用 30分鐘精通計劃(完整版含輸出) ? 時間分配 5分鐘:數據加載與清洗基礎 10分鐘:探索性數據分析(EDA) 10分鐘:數據分析實戰案例 5分鐘:分析報告生成 ?? 第一部分:數據加載與清洗基礎 (5分鐘) 1. 模擬真實數據集 import pandas as pd import nu…

Python爬蟲實戰:研究psd-tools庫相關技術

一、引言 1.1 研究背景 Adobe Photoshop 是目前最流行的圖像處理軟件之一,其原生文件格式 PSD(Photoshop Document)包含了豐富的圖像信息和編輯歷史。PSD 文件不僅在設計領域廣泛使用,還在數字營銷、版權保護和安全分析等領域具有重要價值。然而,手動分析大量 PSD 文件是…

基于卷積傅里葉分析網絡 (CFAN)的心電圖分類的統一時頻方法

一、研究背景與核心問題??ECG分類的挑戰?&#xff1a;心電圖&#xff08;ECG&#xff09;信號分類在心律失常檢測、身份識別等領域至關重要&#xff0c;但傳統方法難以同時有效整合時域和頻域信息。現有方法包括&#xff1a;?時域分類&#xff08;CNN1D&#xff09;??&am…

Linux——LinuxOS

cd,pwd,mkdir,rm,ls,touch,cat,echo,

深度學習篇---矩陣

在機械臂解算、深度學習網絡等硬件和軟件領域中&#xff0c;矩陣運算作為核心數學工具&#xff0c;承擔著數據表示、變換、映射和優化的關鍵作用。以下從具體領域出發&#xff0c;詳細總結涉及的矩陣運算及對應的核心知識&#xff1a;一、機械臂解算領域機械臂解算&#xff08;…

元宇宙:技術烏托邦與數字化未來——基于技術哲學的分析

一、技術哲學視域下的元宇宙本質哲學源流與技術基因的雙重映射理想世界的千年回響&#xff1a;從柏拉圖洞穴隱喻中的影子世界&#xff0c;到普特南“缽中之腦”對虛擬與現實界限的消弭&#xff0c;元宇宙的構想深植于人類對平行世界的永恒追問。中國傳統神話中“天人二元結構”…

如何構建一個基于大模型的實時對話3D數字人?

近年來&#xff0c;隨著元宇宙和AIGC技術的爆發&#xff0c;3D數字人從影視特效走向日常應用。無論是虛擬主播、AI客服&#xff0c;還是數字教師&#xff0c;其核心訴求都是**“能聽、會說、有表情”**的實時交互能力。本文就帶大家了解如何構建一個基于大模型的實時對話的3D數…

NULL值處理:索引優化與業務設計實踐指南

一、NULL值的本質與影響NULL值在數據庫中代表"未知狀態"或"不適用"的特殊標記&#xff0c;與空字符串或0有本質區別12。其特性導致以下業務與性能問題&#xff1a;?語義復雜性?&#xff1a;NULL可能表示"未填寫"(如用戶手機號)或"不適用&…

【add vs commit】Git 中的 add 和 commit 之間的區別

關于git add和git commit還有一些有點不太清楚的地方&#xff0c;這里寫一篇文章好好理一理git add&#xff1a;添加到暫存區 git add實際上是把工作區中的內容存入“暫存區” 通俗來講就是告訴Git&#xff1a;“這些文件我準備好commit了” git add file.txt # 添加單個文件 …

【推薦100個unity插件】使用C#或者unity實現爬蟲爬取靜態網頁數據——Html Agility Pack (HAP)庫和XPath 語法的使用

文章目錄前言一、安裝HtmlAgilityPack1、從NuGet下載HtmlAgilityPack包2、獲取HtmlAgilityPack.dll二、HtmlAgilityPack常用操作1、加載 HTML2、查詢方式2.1 使用 XPath 查詢&#xff08;推薦&#xff09;2.2 使用 LINQ 查詢3、常用查詢操作3.1 選擇節點3.2 獲取屬性值3.3 遍歷…

用 urllib 開啟爬蟲之門:從零掌握網頁數據抓取

在數字時代&#xff0c;數據就是力量。作為一名社會工作者&#xff0c;或許你想了解城市服務資源&#xff1b;作為一個編程初學者&#xff0c;你可能希望從網頁中自動提取新聞、課程或公開數據。今天&#xff0c;我們就來講一講 Python 標準庫中的一把“鑰匙”——urllib 庫&am…

Spring Boot 訂單超時自動取消的 3 種主流實現方案

Spring Boot 訂單超時自動取消的 3 種主流實現方案關鍵詞&#xff1a;Spring Boot、訂單超時、延遲任務、RabbitMQ、Redis、定時任務在電商、外賣、票務等業務中&#xff0c;“下單后若 30 分鐘未支付則自動取消”是一道經典需求。實現方式既要保證 實時性&#xff0c;又要在 高…

0401聚類-機器學習-人工智能

文章目錄一 無監督學習什么是無監督學習&#xff1f;核心特點&#xff1a;無監督學習的主要類型1. 聚類分析 (Clustering)2. 降維 (Dimensionality Reduction)3. 關聯規則學習 (Association Rule Learning)4. 異常檢測 (Anomaly Detection)5. 密度估計 (Density Estimation)二 …

基礎神經網絡模型搭建

nn 包提供通用深度學習網絡的模塊集合&#xff0c;接收輸入張量&#xff0c;計算輸出張量&#xff0c;并保存權重。通常使用兩種途徑搭建 PyTorch 中的模型&#xff1a;nn.Sequential和 nn.Module。 nn.Sequential通過線性層有序組合搭建模型&#xff1b;nn.Module通過__init__…

基于單片機出租車計價器設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的智能化出租車計價系統。系統以單片機為核心處理器&#xff0c;集成…

134. Java 泛型 - 上限通配符

文章目錄134. Java 泛型 - 上限通配符 (? extends T)**1. 什么是上限通配符 (? extends T)&#xff1f;****2. 為什么使用 ? extends T&#xff1f;****3. 示例&#xff1a;使用 ? extends T 進行數據讀取****? 示例 1&#xff1a;計算數值列表的總和****4. 注意事項&…

【1】YOLOv13 AI大模型-可視化圖形用戶(GUI)界面系統開發

【文章內容適用于任意目標檢測任務】【GUI界面系統不局限于YOLOV13&#xff0c;主流YOLO系列模型同樣適用】本文以車輛行人檢測為背景&#xff0c;介紹基于【YOLOV13模型】和【AI大模型】的圖形用戶&#xff08;GUI&#xff09;界面系統的開發。助力大論文實現目標檢測模型的應…

小程序常用api

1. wx.request - 發起網絡請求 用于向服務器發送 HTTP 請求&#xff0c;獲取數據或提交表單。 // 示例&#xff1a;GET 請求獲取數據 wx.request({url: https://api.example.com/data, // 替換為實際 API 地址method: GET,success: (res) > {console.log(請求成功, res.da…

PaliGemma 2-輕量級開放式視覺語言模型

PaliGemma 2是輕量級開放式視覺語言模型 (VLM)&#xff0c;靈感源自 PaLI-3&#xff0c;基于 SigLIP 視覺模型和 Gemma 語言模型等開放式組件。PaliGemma 同時接受圖片和文本作為輸入&#xff0c;并且可以回答有關圖片的詳細問題和背景信息。PaliGemma 2 提供 30 億、100 億和 …