当前位置: 首页 > news >正文

模板类与继承

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模板类继承普通类&#xff08;常见&#xff09; #include<iostream> using namespace std; class AA { public:int m_a;AA(int a) :m_a(a) { cout << "调用了AA的构造函数\n"; }void func1() { cout << "调用func1&#xff08;&#xff09;…...

随手记:uniapp图片展示,剩余的堆叠

UI效果图&#xff1a; 实现思路&#xff1a; 循环图片数组&#xff0c;只展示几张宽度就为几张图片边距的宽度&#xff0c;剩下的图片直接堆叠展示 点击预览的时候传入当前的下标&#xff0c;如果是点击堆叠的话&#xff0c;下标从堆叠数量开始计算 <template><…...

微服务迁移、重构最佳经验

1. 了解现有的单体应用: - 应用架构和技术栈 要了解现有的应用架构和技术栈&#xff0c;可以采取以下几个步骤&#xff1a; 1. 了解应用的背景和目标&#xff1a;首先要了解应用的背景和目标&#xff0c;包括应用所属的行业、应用的类型&#xff08;例如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) 概念&#xff1a; 红黑树是AVL树的变种&#xff0c;它是每一个节点或者着成红色&#xff0c;或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间&#xff0c;它的插入操作使用的是非递归形式实现红黑树的高度最多是…...

高级视频编码器性能对比(H265、VP9、AV1)

1、背景介绍 目前在视频编解码器中&#xff0c;H264已经成为绝对的主流&#xff0c;被大部分设备、浏览器所支持。虽然有更先进的编码器推出&#xff0c;但是受限于推广速度和设备支持成本&#xff0c;一直未能成为主流。 今年公司目标是持续降本增效&#xff0c;现在将”屠刀…...

示例:WPF中DataGrid简单设置合并列头

一、目的&#xff1a;应用DataGridTemplateColumn列模板&#xff0c;去拆分列头和单元格布局的方式设置列头合并样式 二、实现 效果如下 三、环境 VS2022 四、示例 应用DataGridTemplateColumn自定义列头信息和单元格信息 <DataGrid AutoGenerateColumns"False"…...

Matlab图像处理——细胞图像的分割和计数显示

一. 项目介绍 使用MATLAB编写的细胞图像分割及计数系统&#xff0c;实现了对图像内细胞的计数&#xff0c;以及对每个细胞周长和面积的测量&#xff0c;并分别展示了分割后的每个细胞的图像。实验步骤共分为图像预处理、图像预分割、空洞填充、黏连细胞分割、细胞个数统计、细胞…...

六爻排盘神机

选修课留了3000字的论文......确实&#xff0c;削微有那么一点小困难…… 但是&#xff0c;倘若我拿出已经占了6419个字符的 “六爻排盘神机” &#xff0c;阁下…应该…不会…骂我吧 且看&#xff0c;六爻排盘神机&#xff01; 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体系结构中&#xff0c;GICD_ISPENDR<n> 和 GI…...

SpringBoot集成logback初始化源码解析(部分)

一.SpringBoot配置扩展点 SpringBoot日志模块使用监听的方式进行初始化&#xff0c;在SpringBoot项目启动后&#xff0c;会通知日志监听器 在日志监听器中ApplicationStartingEvent事件用来确定到底使用哪个日志系统&#xff0c;logback log4j等 在日志监听器中ApplicationEn…...

【Linux工具】yum软件包管理器与Vim编辑器的高效运用

目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 ​编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试&#xff1a; Vim 命令集解释…...

Matlab数学建模实战应用:案例4 - 图像处理

目录 前言 一、图像处理基础 二、Matlab图像处理工具箱 三、案例&#xff1a;图像锐化、去噪和分割 步骤 1&#xff1a;读取和显示图像 步骤 2&#xff1a;图像锐化 步骤 3&#xff1a;图像去噪 步骤 4&#xff1a;图像分割 完整代码示例 四、实际应用 实例总结 总…...

Studying-代码随想录训练营day15| 222.完全二叉树的节点个数、110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

第十五天&#xff0c;二叉树part03&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 257.完全二叉树的节点个数 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 总结 257.完全二叉树的节点个数 文档讲解&#xff1a;代码随想录完全二叉树的节点个数 视频讲解…...

Python 基础:异常

目录 一、异常概念二、处理异常2.1 抛出异常2.2 使用 try-except 代码块2.3 使用 try-except-else 代码块2.4 静默失败 三、总结 遇到看不明白的地方&#xff0c;欢迎在评论中留言呐&#xff0c;一起讨论&#xff0c;一起进步&#xff01; 本文参考&#xff1a;《Python编程&a…...

XML 应用程序

XML 应用程序 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。它是一种自我描述的语言&#xff0c;允许用户定义自己的标签和文档结构。XML广泛应用于各种应用程序中&#xff0c;包括网站开发、数据交换、文档管理等。本文将探讨XML的一些主要…...

SprringCloud Gateway动态添加路由不重启

文章目录 前言&#xff1a;一、动态路由必要性二、SpringCloud Gateway路由加载过程RouteDefinitionLocator接口PropertiesRouteDefinitionLocator类DiscoveryClientRouteDefinitionLocatorInMemoryRouteDefinitionRepositoryCompositeRouteDefinitionLocator类CachingRouteDef…...

Windows安装mysql

首先去官网下载社区版本的mysql&#xff08;如果连不上&#xff0c;挂梯子&#xff09; https://www.mysql.com/downloads/ 2. 去配置环境变量path 3. 在cmd里面初始化数据库&#xff08;在搜索框输入cmd&#xff0c;或者在资源管理器下搜索烂输入cmd回车就行&#xff09; my…...

chatgpt: linux 下用纯c 编写ui

在Linux下用纯C语言编写用户界面&#xff08;UI&#xff09;&#xff0c;通常会使用GTK或Xlib。GTK是一个更高级的库&#xff0c;提供了丰富的控件和功能&#xff0c;而Xlib则是一个更底层的库&#xff0c;提供了直接操作X Window系统的功能。 下面是一个使用GTK在Linux上创建…...

Java十六进制Dump打印数据

代码 package test;import java.io.IOException;import sun.misc.HexDumpEncoder;@SuppressWarnings("restriction")...

Anomalib Padim模型训练完整踩坑记录:从环境配置、自制数据集准备到ONNX导出一步到位

Anomalib Padim模型实战&#xff1a;工业缺陷检测从零到ONNX部署全指南 工业质检领域正经历一场从传统人工检测到智能算法驱动的变革。想象一下&#xff0c;当生产线上的金属部件以每分钟数十个的速度通过摄像头时&#xff0c;如何确保每个产品表面没有细微划痕、凹陷或腐蚀&am…...

all-MiniLM-L6-v2保姆级教程:Ollama模型卸载、版本回滚与缓存清理指南

all-MiniLM-L6-v2保姆级教程&#xff1a;Ollama模型卸载、版本回滚与缓存清理指南 1. 为什么需要管理你的Ollama模型&#xff1f; 你可能已经用Ollama成功部署了all-MiniLM-L6-v2&#xff0c;体验了它轻量高效的句子嵌入能力。但用久了你会发现&#xff0c;硬盘空间在悄悄减少&…...

MoveBase导航实战:Livox MID360与FAST-LIO+AMCL混合定位的调优与避障策略

1. Livox MID360雷达与FAST-LIO的实战配置 第一次用Livox MID360雷达时&#xff0c;我被它的非重复扫描模式惊艳到了——这种固态激光雷达能实现360无死角覆盖&#xff0c;特别适合狭小空间导航。但要让它在MoveBase系统中稳定工作&#xff0c;需要先解决几个关键配置问题。 雷…...

OpenClaw环境迁移:GLM-4.7-Flash配置的备份与恢复方案

OpenClaw环境迁移&#xff1a;GLM-4.7-Flash配置的备份与恢复方案 1. 为什么需要环境迁移&#xff1f; 上周我的主力开发机突然硬盘故障&#xff0c;导致所有OpenClaw配置丢失。最痛心的是花了两周调试的GLM-4.7-Flash对接设置全部归零——包括精心调整的温度参数、自定义提示…...

单片机开发三大软件架构对比与实践

单片机开发常用软件架构深度解析1. 项目概述在嵌入式系统开发中&#xff0c;软件架构设计直接影响系统的可靠性、可维护性和实时性。本文系统分析三种主流单片机软件架构方案&#xff0c;包括时间片轮询法、操作系统方案和前后台顺序执行法&#xff0c;为开发者提供架构选型参考…...

别再为IP冲突头疼!YOLOv5+海康威视摄像头组网与实时检测的完整避坑指南

工业视觉组网实战&#xff1a;YOLOv5与海康威视摄像头的智能协同方案 在智能制造与安防监控领域&#xff0c;将AI算法与专业摄像设备结合已成为技术标配。但当工程师真正着手部署时&#xff0c;往往会陷入网络配置的泥潭——IP冲突导致设备失联、RTSP流媒体断断续续、多网卡环…...

为什么3分钟搞懂AI

炒又幕燃、RedisShake 核心介绍 RedisShake 是阿里云 Tair 开源团队推出的轻量级Redis数据处理工具&#xff0c;无需复杂依赖&#xff0c;部署简单、操作便捷&#xff0c;能适配自建Redis、云Redis等多种环境&#xff0c;解决Redis全生命周期的数据管理难题。 1.1 四大核心功能…...

15秒生成12个测试用例:AI写的测试比我写的还全

说实话&#xff0c;我一直是个"测试拖延症患者"。每次写完功能代码&#xff0c;心里都清楚应该补测试&#xff0c;但手就是敲不下去。想着"这个功能这么简单&#xff0c;不会有问题的"&#xff0c;然后安慰自己"等有空了再补"。结果呢&#xff1…...

如何用浏览器矢量图形编辑工具提升你的设计效率?

如何用浏览器矢量图形编辑工具提升你的设计效率&#xff1f; 【免费下载链接】svgedit Powerful SVG-Editor for your browser 项目地址: https://gitcode.com/gh_mirrors/sv/svgedit 在数字设计领域&#xff0c;寻找一款既专业又便捷的矢量图形编辑工具始终是设计师和开…...

跨平台嵌入式开发库gear-lib功能解析与应用

1. 跨平台嵌入式开发基础库gear-lib深度解析1.1 项目概述gear-lib是一组采用POSIX C标准实现的通用基础库集合&#xff0c;其设计目标是为嵌入式系统、物联网设备及网络服务开发提供跨平台支持。该库支持Linux、Windows、Android和iOS等多种操作系统环境&#xff0c;采用MIT开源…...