C++類模板繼承部分知識及測試代碼

目錄

0.前言

1.類模板基本使用

2.類模板繼承

2.1類模板繼承過程中的模板參數

情況1:父類非模板,子類為模板

情況2:父類模板,子類為非模板

情況3:父類模板,子類為模板

3.STL中的模板類分析

3.1STL中list繼承關系

3.2STL中vector繼承關系

后續補充


0.前言

本篇將整理類模板部分知識點。因為相關知識點可能較多,所以后面會將相關內容不斷補充到這篇文章中。

1.類模板基本使用

類模板基本使用是這樣的:

// 類模板繼承
#include<iostream>template <typename T>
class Base {
public:T data;Base(T val) : data(val) {}
};template <typename T>
class Derived : public Base<T> {
public:Derived(T val) : Base<T>(val) {}void print() {std::cout << "Derived data: " << this->data << std::endl;// std::cout << "Derived data: " << data << std::endl;}
};int main(void){Derived<int> d(42);d.print(); // 輸出: Derived data: 42return 0;
}

此外,還有一個很陰間的用法,類模板模板參數,它的使用大概是下面這樣的:

#include<vector>
template<typename T>
using vector = std::vector<T>;
template<typename T,template<typename U> class Con>
class Container {
public:Con<T> item;Container(T val) {item.push_back(val);std::cout << "Container initialized with value: " << val << std::endl;}void display() {for(auto & elem : item) {std::cout << elem << " ";}     }
};int main(void){Container<int, vector> c(100);c.display(); // 輸出: Container holds: 100return 0;
}

2.類模板繼承

2.1類模板繼承過程中的模板參數

情況1:父類非模板,子類為模板

嚴格來說,不算類模板繼承,但是也列舉在這里。代碼如下:

class Base {
public:int data;Base(int val) : data(val) {}
};template <typename T>
class Derived : public Base{
public:Derived(T val) : Base(val) {}void print() {std::cout << "Derived data: " << this->data << std::endl;// std::cout << "Derived data: " << data << std::endl;}
};
情況2:父類模板,子類為非模板

這種情況可能不嚴謹,但是從內存角度來說,它的意思是父類對應的內存由實例化確定,子類內存是確定的。

template <typename T>
class Derived : public Base<T>{
public:Derived(int val) : Base<T>(val) {}void print() {std::cout << "Derived data: " << this->data << std::endl;// std::cout << "Derived data: " << data << std::endl;}
};
情況3:父類模板,子類為模板

這種情況是比較典型的模板類繼承,代碼如下:

template <typename U,typename T>
class Derived : public Base<T>{
public:Derived(T val) : Base<T>(val) {}void print() {std::cout << "Derived data: " << this->data << std::endl;// std::cout << "Derived data: " << data << std::endl;}
};

3.STL中的模板類分析

3.1STL中list繼承關系

下圖為GCC 8.1.0的list的繼承關系圖,你知道它的大小嗎?

如果對繼承和包含不熟悉可以移步另一篇文章:

C++繼承和包含知識及測試代碼-CSDN博客

已知條件為:

(1)空心箭頭表示繼承(is-a),實心箭頭表示包含(has-a);

(2)_List_node_base包含的兩個元素是指針類型。

(3)_M_size為 unsigned long long類型

----------------------------------------------------------分割線--------------------------------------------------------------

其實list的大小和以下這個結構體是相等的。其中兩個指針對應著鏈表(雙向)節點的中的兩個指針,另外一個對應鏈表的長度信息。在64bit編譯器中,我輸出的結果是24字節。

struct A{_List_node_base* a;_List_node_base* b;unsigned long long c;
};

更直觀的,如果對vscode熟悉的話,可以看一下debug界面。如下圖,是不是對list結構更清晰了一點呢?

3.2STL中vector繼承關系

看完了list,看下常用的vector,它相對要簡單一些,可以看出它的大小嗎?

已知條件為:

_Vector_impl包含的三個元素都是指針類型。

----------------------------------------------------------分割線--------------------------------------------------------------

同樣的,在64bit編譯器中,我輸出的結果是24字節。在vscode中,可以看到其內存布局如下圖:

后續補充

此部分由于比較復雜,后續會繼續補充!

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

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

相關文章

Laravel + Python 圖片水印系統:實現與調試指南

前言 本系統通過 Laravel 作為前端框架接收用戶上傳的圖片&#xff0c;調用 Python 腳本處理水印添加&#xff0c;最終返回處理后的圖片。這種架構充分利用了 Laravel 的便捷性和 Python 圖像處理庫的強大功能。 一、Python 水印處理腳本 from PIL import Image, ImageEnhance …

【速通RAG實戰:企業應用】25、從數智化場景看RAG:是臨時方案,還是終局架構?

引言&#xff1a;RAG為何成為數智化場景的"必爭之地"&#xff1f; 當ChatGPT在2023年掀起生成式AI浪潮時&#xff0c;一個矛盾逐漸凸顯&#xff1a;大語言模型&#xff08;LLM&#xff09;能生成流暢文本&#xff0c;卻常陷入"幻覺"&#xff08;虛構事實&a…

[Python] -實用技巧篇1-用一行Python代碼搞定日常任務

在日常開發或數據處理過程中,我們常常為了一些簡單的小任務寫出數行代碼。但實際上,Python 提供了大量強大且簡潔的語法糖和標準庫工具,讓你用“一行代碼”輕松搞定復雜操作。 本文將通過多個典型場景展示如何用“一行 Python 代碼”高效完成常見任務。 一、文件操作:快速…

單細胞入門(1)——介紹

一、單細胞轉錄組測序流程介紹 單細胞測序能夠探索復雜組織中單個細胞的不同生物學特性&#xff0c;幫助我們認識細胞與細胞之間的差異。這些檢測方法有助于研究細胞譜系、細胞功能、細胞分化、細胞增殖和細胞應答&#xff0c;提升我們對復雜生物系統的理解&#xff0c;包括腫…

數據結構與算法之美:跳表

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C修煉之路》 歡迎點贊&#xff0c;關注&am…

從0設計一個短鏈接服務:如何實現盡可能短、可變長的短網址系統?

從 0 設計一個短鏈接服務&#xff1a;如何實現盡可能短、可變長的短網址系統&#xff1f; 在日常生活中&#xff0c;我們經常在短信、微博、廣告營銷中看到“短鏈接”&#xff0c;如&#xff1a; https://t.cn/EXaQ4xY https://bit.ly/3Yp9zJk相比冗長復雜的原始 URL&#xff0…

Microsoft Word 中 .doc 和 .docx 的區別

Microsoft Word 中 .doc 和 .docx 的區別 解釋 Microsoft Word 中 .doc 和 .docx 文件格式的區別。這些格式都是 Word 處理文檔的標準&#xff0c;但它們在結構、兼容性和功能上存在顯著差異。下面我將詳細說明。 1. 基本定義 .doc&#xff1a;這是 Microsoft Word 的舊格式&am…

Springboot aop面向切面編程

aop:面向切面編程&#xff0c;理解在一個流程中插入一個切面&#xff0c;這樣切面方法會在指定位置執行能無影響的在某些方法前或者后插入一些動作springboot使用1.引入依賴<dependency><groupId>org.springframework.boot</groupId><artifactId>sprin…

手機識別數據集,2628張原始圖片,支持yolo,coco json,pasical voc xml等格式的標注

本文提供手機識別數據集&#xff0c;2628張原始圖片&#xff0c;支持yolo&#xff0c;coco json,pasical voc xml等格式的標注的數據集下載&#xff0c;下載地址在文末手機識別數據集簡介手機識別數據集通常用于訓練和評估機器學習模型&#xff0c;以識別不同手機品牌、型號或功…

ollama - sqlcoder模型:面向提示詞編程(根據用戶信息生成sql語句并執行返回結果)

https://ollama.ac.cn/library/sqlcoderhttps://blog.csdn.net/hzether/article/details/143816042import ollama import sqlite3 import json from contextlib import closingdef generate_and_execute_sql(question: str, db_path: str) -> dict:# 1. 生成 SQL 查詢語句pr…

C語言,結構體指針案例

案例一&#xff1a; #include <stdio.h> #include <stdbool.h> #include <string.h> // 添加string.h頭文件用于strcpy //結構體指針//方式 1 : 先定義結構體 struct Dog {char *name;int age;char weight; };//方式 1 : char *get_dog_info(struct Dog do…

Vue 3 中父子組件雙向綁定的 4 種方式

&#x1f501; Vue 3 中父子組件雙向綁定的 4 種方式 整理不易&#xff0c;點贊 收藏 關注&#xff0c;助你組件通信不再混亂&#xff01;? 場景說明 父組件希望將某個值傳遞給子組件&#xff0c;同時希望子組件能夠修改這個值&#xff08;實現“綁定 反向更新”&#xff0…

阻有形,容無聲——STA 簽核之RC Corner

RC corner&#xff0c;RC指的是gate跟network的寄生參數&#xff0c;寄生參數抽取工具&#xff08;比如Starrc&#xff09;根據電路的物理信息&#xff0c;抽取出電路的電阻電容值&#xff0c;再以寄生參數文件&#xff08;Spef&#xff09;輸入給STA工具&#xff08;PT&#x…

多代理系統(multi-agent)框架深度解析:架構、特性與未來

在人工智能技術迭代的浪潮中&#xff0c;多代理系統&#xff08;Multi-Agent System&#xff09;正從實驗室走向產業應用的核心舞臺。這一技術范式的崛起源于三大驅動力&#xff1a;大模型能力的指數級提升、復雜任務分解的需求爆發&#xff0c;以及傳統單體智能架構的局限性日…

【Redis】黑馬點評筆記:使用redis解決各種分布式/并發問題

1、系統架構2、基于session登錄用戶的 session 是由服務器&#xff08;如 Tomcat&#xff09;自動管理和維護的&#xff0c;每個用戶在訪問 Web 應用時都會擁有一個獨立的 session 對象。這個對象是通過瀏覽器和服務器之間的 HTTP 協議自動綁定的。1. 如何區分不同用戶的 Sessi…

Javaweb- 11 MVC架構模式

MVC&#xff08;Model View Controller&#xff09; 是軟件工程中一種軟件架構模式&#xff0c;它把軟件系統分為模型&#xff0c;視圖&#xff0c;控制器&#xff0c;三個基本部分。用一種業務邏輯&#xff0c;數據&#xff0c;界面顯示分離的方法組織代碼&#xff0c;將業務邏…

【電腦】主板的基礎知識

主板&#xff08;Motherboard&#xff09;是計算機的核心組件之一&#xff0c;它將所有其他硬件部件連接在一起并協調它們的工作。以下是關于主板的詳細知識&#xff1a;1. 架構組成一個典型的主板通常由以下幾個主要部分構成&#xff1a;芯片組&#xff08;Chipset&#xff09…

【飛算JavaAI】一站式智能開發,驅動Java開發全流程革新

【作者主頁】Francek Chen 【專欄介紹】???人工智能與大模型應用??? 人工智能&#xff08;AI&#xff09;通過算法模擬人類智能&#xff0c;利用機器學習、深度學習等技術驅動醫療、金融等領域的智能化。大模型是千億參數的深度神經網絡&#xff08;如ChatGPT&#xff09…

STM32中的RTC(實時時鐘)詳解

前言&#xff1a;為什么需要RTC&#xff1f; 在嵌入式系統中&#xff0c;時間記錄是一項基礎且關鍵的功能。想象一下&#xff1a;智能家居設備需要按時間觸發開關燈&#xff0c;工業儀表需要記錄傳感器數據的采集時刻&#xff0c;物聯網終端需要同步服務器時間戳……這些場景都…

Python技巧記錄

空格拼接數組格式化顯示 一維數組 arr [1, 2, 3, 4, 5] print( .join(map(str, arr))) # 直接轉換并連接二維數組 for row in arr:print( .join(map(str, row)))for row in arr: 此循環會遍歷矩陣arr中的每一行。這里的arr是一個二維列表&#xff0c;每一行代表一個子列表。m…