模板类与继承
1模板类继承普通类(常见)
#include<iostream>
using namespace std;
class AA
{
public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()函数 :m_a = " << m_a << endl; }
};
template <class T1,class T2>
class BB
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y) :m_x(x), m_y(y) { cout << "调用了BB的构造函数,\n"; }void func2() { cout << "调用了func2()函数:x = " << m_x << "y = "<<m_y<<endl; ; }
};
int main() {BB<int, string> bb(8, "zhongge");bb.func2();return 0;
}
现在AA BB没有任何关系,如果把普通类作为基类,把模板类BB作为子类,继承AA。
#include<iostream>
using namespace std;\
class AA
{
public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()函数 :m_a = " << m_a << endl; }
};
template <class T1,class T2>
class BB:public AA
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y) :m_x(x), m_y(y) { cout << "调用了BB的构造函数,\n"; }void func2() { cout << "调用了func2()函数:x = " << m_x << "y = "<<m_y<<endl; ; }
};
int main() {BB<int, string> bb(8, "zhongge");bb.func2();return 0;
}
让BB继承AA但是出现了错误:AA没有合适的默认的构造函数。
继承的时候派。生类如何构造基类:要在派生类BB构造函数的初始化列表中指明基类的构造函数。
#include<iostream>
using namespace std;\
class AA
{
public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()函数 :m_a = " << m_a << endl; }
};
template <class T1,class T2>
class BB:public AA
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y,int a) :AA(a),m_x(x), m_y(y) { cout << "调用了BB的构造函数,\n"; }void func2() { cout << "调用了func2()函数:x = " << m_x << " ,y = "<<m_y<<endl; ; }
};
int main() {BB<int,string> bb(8, "zhongge",3);bb.func2();bb.func1();return 0;
}
调用了AA的构造函数
调用了BB的构造函数,
调用了func2()函数:x = 8 ,y = zhongge
调用func1()函数 :m_a = 3C:\Users\代伟业\Desktop\C++\初始化列表\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe (进程 19556)已退出,代码为 0。
按任意键关闭此窗口. . .
2普通类继承模板类的实例版本
#include<iostream>
using namespace std;
template <class T1, class T2>
class BB
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y) : m_x(x), m_y(y) { cout << "调用了BB的构造函数,\n"; }void func2() { cout << "调用了func2()函数:x = " << m_x << " ,y = " << m_y << endl; ; }
};class AA :public BB <int,string>
{
public:int m_a;AA(int a,int x,string y) :BB(x,y),m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()函数 :m_a = " << m_a << endl; }
};
int main() {AA aa(3,8,"zhongge");aa.func2();aa.func1();return 0;
}
调用了BB的构造函数,
调用了AA的构造函数
调用了func2()函数:x = 8 ,y = zhongge
调用func1()函数 :m_a = 3C:\Users\代伟业\Desktop\C++\初始化列表\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe (进程 7360)已退出,代码为 0。
按任意键关闭此窗口. . .
3普通类继承模板类
#include<iostream>
using namespace std;
template <class T1, class T2>
class BB
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y) : m_x(x), m_y(y) { cout << "调用了BB的构造函数,\n"; }void func2() { cout << "调用了func2()函数:x = " << m_x << " ,y = " << m_y << endl; ; }
};
template <class T1, class T2>
class AA :public BB <T1,T2>
{
public:int m_a;AA(int a,T1 x,T2 y) :BB<T1,T2>(x,y),m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()函数 :m_a = " << m_a << endl; }
};
int main() {AA<int,string> aa(3,8,"zhongge");aa.func2();aa.func1();return 0;
}
4模板类继承模板类。
#include<iostream>
using namespace std;
template <class T1, class T2>
class BB
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y) : m_x(x), m_y(y) { cout << "调用了BB的构造函数,\n"; }void func2() { cout << "调用了func2()函数:x = " << m_x << " ,y = " << m_y << endl; ; }
};
template <class T1, class T2>
class AA :public BB <T1,T2>
{
public:int m_a;AA(int a,T1 x,T2 y) :BB<T1,T2>(x,y),m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()函数 :m_a = " << m_a << endl; }
};
template <class T,class T1,class T2>
class CC:public BB<T1,T2>
{public:T m_a;CC(const T a, const T1 x,const T2 y) :BB<T1, T2>(x, y), m_a(a) { cout << "调用leCC的构造函数\n"; }void func3() { cout << "调用func1()函数 :m_a = " << m_a << endl; }
};
int main() {AA<int,string> aa(3,8,"zhongge");aa.func2();aa.func1();CC <int,int,string> cc(3, 8, "我是一只傻傻鸟");return 0;
}
5模板类继承模板参数给出的基类(不能是模板类)
#include<iostream>
using namespace std;class AA
{
public:AA(){ cout << "调用leAA的构造函数\n"; }AA(int a) { cout << "调用leAA(int a)的构造函数"; }
};
class BB
{
public:BB() { cout << "调用leBB的构造函数\n"; }BB(int a) { cout << "调用leBB(int a)的构造函数"; }
};
template <class T>
class CC:public T
{public:CC():T() { cout << "调用leCC的构造函数\n"; }CC(int a):T(a) { cout << "调用leCC(int a)的构造函数"; }
};int main() {CC<AA> ca1;//AA作为基类CC<BB> cb2;//BB作为基类return 0;
}
相关文章:
模板类与继承
1模板类继承普通类(常见) #include<iostream> using namespace std; class AA { public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1()…...
随手记:uniapp图片展示,剩余的堆叠
UI效果图: 实现思路: 循环图片数组,只展示几张宽度就为几张图片边距的宽度,剩下的图片直接堆叠展示 点击预览的时候传入当前的下标,如果是点击堆叠的话,下标从堆叠数量开始计算 <template><…...
微服务迁移、重构最佳经验
1. 了解现有的单体应用: - 应用架构和技术栈 要了解现有的应用架构和技术栈,可以采取以下几个步骤: 1. 了解应用的背景和目标:首先要了解应用的背景和目标,包括应用所属的行业、应用的类型(例如Web应用、移动应用等…...
【Python】从0开始的Django基础
Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…...
红黑树(数据结构篇)
数据结构之红黑树 红黑树(RB-tree) 概念: 红黑树是AVL树的变种,它是每一个节点或者着成红色,或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间,它的插入操作使用的是非递归形式实现红黑树的高度最多是…...
高级视频编码器性能对比(H265、VP9、AV1)
1、背景介绍 目前在视频编解码器中,H264已经成为绝对的主流,被大部分设备、浏览器所支持。虽然有更先进的编码器推出,但是受限于推广速度和设备支持成本,一直未能成为主流。 今年公司目标是持续降本增效,现在将”屠刀…...
示例:WPF中DataGrid简单设置合并列头
一、目的:应用DataGridTemplateColumn列模板,去拆分列头和单元格布局的方式设置列头合并样式 二、实现 效果如下 三、环境 VS2022 四、示例 应用DataGridTemplateColumn自定义列头信息和单元格信息 <DataGrid AutoGenerateColumns"False"…...
Matlab图像处理——细胞图像的分割和计数显示
一. 项目介绍 使用MATLAB编写的细胞图像分割及计数系统,实现了对图像内细胞的计数,以及对每个细胞周长和面积的测量,并分别展示了分割后的每个细胞的图像。实验步骤共分为图像预处理、图像预分割、空洞填充、黏连细胞分割、细胞个数统计、细胞…...
六爻排盘神机
选修课留了3000字的论文......确实,削微有那么一点小困难…… 但是,倘若我拿出已经占了6419个字符的 “六爻排盘神机” ,阁下…应该…不会…骂我吧 且看,六爻排盘神机! import random import datetime from lunarcale…...
【ARMv8/v9 GIC 系列 2.1 -- GIC SPI 中断的 pending 和 clear pending 配置】
文章目录 GIC Pending 和 Clear PendingGICD_ISPENDR<n>GICD_ICPENDR<n>参数<n>编号解释使用举例设置中断ID 100为挂起状态清除中断ID 100的挂起状态 代码实现小结 GIC Pending 和 Clear Pending 在ARMv8体系结构中,GICD_ISPENDR<n> 和 GI…...
SpringBoot集成logback初始化源码解析(部分)
一.SpringBoot配置扩展点 SpringBoot日志模块使用监听的方式进行初始化,在SpringBoot项目启动后,会通知日志监听器 在日志监听器中ApplicationStartingEvent事件用来确定到底使用哪个日志系统,logback log4j等 在日志监听器中ApplicationEn…...
【Linux工具】yum软件包管理器与Vim编辑器的高效运用
目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试: Vim 命令集解释…...
Matlab数学建模实战应用:案例4 - 图像处理
目录 前言 一、图像处理基础 二、Matlab图像处理工具箱 三、案例:图像锐化、去噪和分割 步骤 1:读取和显示图像 步骤 2:图像锐化 步骤 3:图像去噪 步骤 4:图像分割 完整代码示例 四、实际应用 实例总结 总…...
Studying-代码随想录训练营day15| 222.完全二叉树的节点个数、110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和
第十五天,二叉树part03💪,编程语言:C 目录 257.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 总结 257.完全二叉树的节点个数 文档讲解:代码随想录完全二叉树的节点个数 视频讲解…...
Python 基础:异常
目录 一、异常概念二、处理异常2.1 抛出异常2.2 使用 try-except 代码块2.3 使用 try-except-else 代码块2.4 静默失败 三、总结 遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步! 本文参考:《Python编程&a…...
XML 应用程序
XML 应用程序 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它是一种自我描述的语言,允许用户定义自己的标签和文档结构。XML广泛应用于各种应用程序中,包括网站开发、数据交换、文档管理等。本文将探讨XML的一些主要…...
SprringCloud Gateway动态添加路由不重启
文章目录 前言:一、动态路由必要性二、SpringCloud Gateway路由加载过程RouteDefinitionLocator接口PropertiesRouteDefinitionLocator类DiscoveryClientRouteDefinitionLocatorInMemoryRouteDefinitionRepositoryCompositeRouteDefinitionLocator类CachingRouteDef…...
Windows安装mysql
首先去官网下载社区版本的mysql(如果连不上,挂梯子) https://www.mysql.com/downloads/ 2. 去配置环境变量path 3. 在cmd里面初始化数据库(在搜索框输入cmd,或者在资源管理器下搜索烂输入cmd回车就行) my…...
chatgpt: linux 下用纯c 编写ui
在Linux下用纯C语言编写用户界面(UI),通常会使用GTK或Xlib。GTK是一个更高级的库,提供了丰富的控件和功能,而Xlib则是一个更底层的库,提供了直接操作X Window系统的功能。 下面是一个使用GTK在Linux上创建…...
Java十六进制Dump打印数据
代码 package test;import java.io.IOException;import sun.misc.HexDumpEncoder;@SuppressWarnings("restriction")...
Anomalib Padim模型训练完整踩坑记录:从环境配置、自制数据集准备到ONNX导出一步到位
Anomalib Padim模型实战:工业缺陷检测从零到ONNX部署全指南 工业质检领域正经历一场从传统人工检测到智能算法驱动的变革。想象一下,当生产线上的金属部件以每分钟数十个的速度通过摄像头时,如何确保每个产品表面没有细微划痕、凹陷或腐蚀&am…...
all-MiniLM-L6-v2保姆级教程:Ollama模型卸载、版本回滚与缓存清理指南
all-MiniLM-L6-v2保姆级教程:Ollama模型卸载、版本回滚与缓存清理指南 1. 为什么需要管理你的Ollama模型? 你可能已经用Ollama成功部署了all-MiniLM-L6-v2,体验了它轻量高效的句子嵌入能力。但用久了你会发现,硬盘空间在悄悄减少&…...
MoveBase导航实战:Livox MID360与FAST-LIO+AMCL混合定位的调优与避障策略
1. Livox MID360雷达与FAST-LIO的实战配置 第一次用Livox MID360雷达时,我被它的非重复扫描模式惊艳到了——这种固态激光雷达能实现360无死角覆盖,特别适合狭小空间导航。但要让它在MoveBase系统中稳定工作,需要先解决几个关键配置问题。 雷…...
OpenClaw环境迁移:GLM-4.7-Flash配置的备份与恢复方案
OpenClaw环境迁移:GLM-4.7-Flash配置的备份与恢复方案 1. 为什么需要环境迁移? 上周我的主力开发机突然硬盘故障,导致所有OpenClaw配置丢失。最痛心的是花了两周调试的GLM-4.7-Flash对接设置全部归零——包括精心调整的温度参数、自定义提示…...
单片机开发三大软件架构对比与实践
单片机开发常用软件架构深度解析1. 项目概述在嵌入式系统开发中,软件架构设计直接影响系统的可靠性、可维护性和实时性。本文系统分析三种主流单片机软件架构方案,包括时间片轮询法、操作系统方案和前后台顺序执行法,为开发者提供架构选型参考…...
别再为IP冲突头疼!YOLOv5+海康威视摄像头组网与实时检测的完整避坑指南
工业视觉组网实战:YOLOv5与海康威视摄像头的智能协同方案 在智能制造与安防监控领域,将AI算法与专业摄像设备结合已成为技术标配。但当工程师真正着手部署时,往往会陷入网络配置的泥潭——IP冲突导致设备失联、RTSP流媒体断断续续、多网卡环…...
为什么3分钟搞懂AI
炒又幕燃、RedisShake 核心介绍 RedisShake 是阿里云 Tair 开源团队推出的轻量级Redis数据处理工具,无需复杂依赖,部署简单、操作便捷,能适配自建Redis、云Redis等多种环境,解决Redis全生命周期的数据管理难题。 1.1 四大核心功能…...
15秒生成12个测试用例:AI写的测试比我写的还全
说实话,我一直是个"测试拖延症患者"。每次写完功能代码,心里都清楚应该补测试,但手就是敲不下去。想着"这个功能这么简单,不会有问题的",然后安慰自己"等有空了再补"。结果呢࿱…...
如何用浏览器矢量图形编辑工具提升你的设计效率?
如何用浏览器矢量图形编辑工具提升你的设计效率? 【免费下载链接】svgedit Powerful SVG-Editor for your browser 项目地址: https://gitcode.com/gh_mirrors/sv/svgedit 在数字设计领域,寻找一款既专业又便捷的矢量图形编辑工具始终是设计师和开…...
跨平台嵌入式开发库gear-lib功能解析与应用
1. 跨平台嵌入式开发基础库gear-lib深度解析1.1 项目概述gear-lib是一组采用POSIX C标准实现的通用基础库集合,其设计目标是为嵌入式系统、物联网设备及网络服务开发提供跨平台支持。该库支持Linux、Windows、Android和iOS等多种操作系统环境,采用MIT开源…...
