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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…