C++模板类与继承

目录

分类

一、模板类不继承

(1)代码

(2)分析

(3)运行结果

二、模板类继承普通类

(1)代码

(2)分析

(3)运行结果

三、普通类继承模板类的实例版本

(1)代码

(2)分析

3)运行结果

四、普通类继承模板类(常见)(模板类含通用类型参数)

(1)代码

(2)分析

(3)运行结果

五、模板类继承模板类

(1)代码

(2)分析

(3)运行结果

 六、模板类继承模板参数给出的基类(不能是模板类)

(1)代码

(2)分析

(3)运行结果


分类

1)模板类继承普通类(常见)

2)普通类继承模板类的实例版本

3)普通类继承模板类(常见)

4)模板类继承模板类

5)模板类继承模板参数给出的基类(不能是模板类)

一、模板类不继承

(1)代码

#include<iostream>
using namespace std;

//模板类BB
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的构造函数。"<<endl;}
		void fun2()const{cout<<"调用了func2()函数:x="<<m_x<<",y="<<m_y<<endl;}
};

int main()
{
	BB<int,string>bb(8,"我是一只小猫咪。");
	bb.fun2();
	return 0;
}

(2)分析

①模板类BB直接实例化,不继承其他类。

(3)运行结果

二、模板类继承普通类

(1)代码

//普通类AA作为基类,BB类作为派生类
#include<iostream>
using namespace std;

//AABB都没有默认的构造函数
//普通类AA
class AA
{
	public:
		int m_a;
		AA(int a):m_a(a){cout<<"调用了AA的构造函数。"<<endl;}
		void fun1(){cout<<"调用了func1()函数:m_a="<<m_a<<endl;}	
};

//模板类BB
template<class T1,class T2>
class BB:public AA    //111111继承普通类
{
	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的构造函数。"<<endl;}    //222222派生类的构造函数要调用基类的构造函数
		void fun2()const{cout<<"调用了func2()函数:x="<<m_x<<",y="<<m_y<<endl;}
};

int main()
{
	BB<int,string>bb(8,"我是一只小猫咪。",3);
	bb.fun2();
	bb.fun1();        //调用基类的func1()函数
	return 0;
}

(2)分析

①程序定义了一个普通类AA,模板类BB作为基类继承普通类AA

template<class T1,class T2>                 //加模板标签

class BB:public AA  

②只需要修改派生类BB的构造函数,调用基类AA的构造函数即可;

BB(const T1 x,const T2 y,int a):AA(a),m_x(x),m_y(y)

(3)运行结果

三、普通类继承模板类的实例版本

(1)代码

#include<iostream>
using namespace std;
//AABB都没有默认的构造函数
//模板类BB
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的构造函数。"<<endl;}
		void fun2()const{cout<<"调用了func2()函数:x="<<m_x<<",y="<<m_y<<endl;}
};

//普通类AA
class AA:public BB<int,string>    //普通类AA继承模板类BB
{
	public:
		int m_a;
		AA(int a,int x,string y):BB(x,y),m_a(a){cout<<"调用了AA的构造函数。"<<endl;}                            //派生类构造函数调用基类构造函数(初始化列表)
		void fun1(){cout<<"调用了func1()函数:m_a="<<m_a<<endl;}	
};

int main()
{
	AA aa(3,8,"我是一只小猫咪。");
	aa.fun1();        //调用派生类函数
	aa.fun2();        //调用基类函数
	return 0;
}

(2)分析

①普通类AA作为派生类继承模板类BB

AA只是继承BB的某一个实例化版本,普通类继承,没有特殊之处

class AA:public BB<int,string>                 //不需要加模板标签

②修改派生类AA的构造函数调用基类BB的构造函数即可

AA(int a,int x,string y):BB(x,y),m_a(a)

3)运行结果

四、普通类继承模板类(常见)(模板类含通用类型参数)

(1)代码

#include<iostream>
using namespace std;

//AABB都没有默认的构造函数
//模板类BB
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的构造函数。"<<endl;}
		void fun2()const{cout<<"调用了func2()函数:x="<<m_x<<",y="<<m_y<<endl;}
};

//模板类AA
template<class T1,class T2>    //11111BB的模板类标签复制下来
class AA:public BB<T1,T2>        //22222普通类继承通用模板类
{
	public:
		int m_a;            
		AA(int a,T1 x,T2 y):BB<T1,T2>(x,y),m_a(a){cout<<"调用了AA的构造函数。"<<endl;}                        //333333修改构造函数
		void fun1(){cout<<"调用了func1()函数:m_a="<<m_a<<endl;}	
};

int main()
{
	AA <int,string>aa(3,8,"我是一只小猫咪。");   //4444AA是一个模板类,需要模板标签
	aa.fun1();
	aa.fun2();
	return 0;
}

(2)分析

①普通类AA作为派生类继承模板类BB(非实例化)

要保留BB的通用类型,就需要把AA变成模板类

template<class T1,class T2>    //BB的模板类标签复制下来
class AA:public BB<T1,T2>        //普通类继承通用模板类

②修改派生类AA的构造函数调用基类BB的构造函数即可

AA(int a,T1 x,T2 y):BB<T1,T2>(x,y),m_a(a)

(3)运行结果

 

五、模板类继承模板类

(1)代码

#include<iostream>
using namespace std;
//AABB都没有默认的构造函数
//模板类BB
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的构造函数。"<<endl;}
		void fun2()const{cout<<"调用了func2()函数:x="<<m_x<<",y="<<m_y<<endl;}
};

//普通类AA
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的构造函数。"<<endl;}
		void fun1(){cout<<"调用了func1()函数:m_a="<<m_a<<endl;}	
};

//模板类CC
template<class T,class T1,class T2>    //11111111CC类模板标签增加两个通用类型参数
class CC:public BB<T1,T2>              //22222222CC类继承BB类
{
	public:
		T m_a;
		CC(const T a,const T1 x,const T2 y):BB<T1,T2>(x,y),m_a(a){cout<<"调用了CC的构造函数。\n"<<endl;}              //CC类构造函数调用基类BB构造函数
		void fun3(){cout<<"调用了fun3()函数:m_a="<<m_a<<endl;}
};
int main()
{
	CC <int,int,string>cc(3,8,"我是一只小猫咪。");
	cc.fun3();
	cc.fun2();
	return 0;
}

(2)分析

①增加一个模板类CC

template<class T>
class CC
{
    public:
        T m_a;
        CC(const T a):m_a(a){cout<<"调用了CC的构造函数。\n"<<endl;}
        void fun3(){cout<<"调用了fun3()函数:m_a="<<m_a<<endl;}
};

②模板类CC继承BB

template<class T,class T1,class T2>    //CC类模板标签增加两个通用类型参数
class CC:public BB<T1,T2>              //CC类继承BB类

 ②修改派生类CC的构造函数调用基类BB的构造函数即可;

CC(const T a,const T1 x,const T2 y):BB<T1,T2>(x,y),m_a(a)

(3)运行结果

 

 

 六、模板类继承模板参数给出的基类(不能是模板类)

(1)代码

#include<iostream>
using namespace std;

//普通类AA
class AA
{
	public:
		AA(){cout<<"调用了AA的构造函数AA()。"<<endl;}
		AA(int a){cout<<"调用了AA的构造函数AA(int a)。"<<endl;}
};

//普通类BB
class BB
{
	public:
		BB(){cout<<"调用了BB的构造函数BB()。"<<endl;}
		BB(int a){cout<<"调用了BB的构造函数BB(int a)。"<<endl;}
};

//普通类CC
class CC
{
	public:
		CC(){cout<<"调用了CC的构造函数CC()。"<<endl;}
		CC(int a){cout<<"调用了CC的构造函数CC(int a)。"<<endl;}
};

//模板类DD
template<class T>
class DD
{
	public:
		DD(){cout<<"调用了DD的构造函数DD()。"<<endl;}
		DD(int a){cout<<"调用了DD的构造函数DD(int a)。"<<endl;}
};

//模板类EE
template<class T>
class EE:public T
{
	public:
		EE():T(){cout<<"调用了EE的构造函数EE()。"<<endl;}
		EE(int a):T(a){cout<<"调用了EE的构造函数EE(int a)。"<<endl;}
};

int main()
{
	EE<AA>ea1;//AA作为基类
	EE<BB>eb1;//BB作为基类
	EE<CC>ec1;//CC作为基类
	EE<DD<int>  >ed1; //DD<int>作为基类,模板类作为基类时,必须明确指出模板类型参数
	//EE<DD>ed1;  		 //DD作为基类,错误
	return 0;
}

 (2)分析

①EE是模板类,有一个通用模板类型参数,在继承时T可以是普通类,也可以是模板类;

②但是在继承模板类的时候需要指明基类的通用类型参数。

    EE<DD<int>  >ed1; //DD<int>(类名)作为基类,模板类作为基类时,必须明确指出模板类型参数
    //EE<DD>ed1;           //DD作为基类,错误

(3)运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win11校园网不弹出登录页面怎么回事?

Win11校园网不弹出登录页面怎么回事&#xff1f;最近有用户在使用校园网的时候遇到了一些问题&#xff0c;访问登录网站的时候&#xff0c;一直无法显示登录的界面。那么遇到这个情况如何去进行解决呢&#xff1f;一起来看看以下的解决方法分享吧。 解决方法如下&#xff1a; 方…

nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式&#xff0c;这里用的是js-xlsx库&#xff1b; 需求 有一个 xlsx 的文件&#xff0c;里面有几个不同的 sheet&#xff0c;需要读取这个表格中不同 sheet 的数据&#xff0c;并且为每个 sheet 生成对应的 json 文件。 例如有一个名为 template…

文本三剑客之——Awk

Awk Awk简介Awk语法格式Awk常见内置变量Awk实例演示按行输出文本BEGIN模式和END模式按字段输出文本通过管道&#xff0c;双引号调用shell命令date 的用法getline的用法awk数组 Awk简介 Awk是一个功能强大的编辑工具&#xff0c;用于在Linux/UNIX 下对文本和数据进行处理。数据…

ChatGPT vs. Bing vs. Bard

随着 2022 年 ChatGTP 的推出&#xff0c;人工智能聊天机器人的世界突然走上了一条新道路。如今&#xff0c;密切关注 AI 的人都知道&#xff0c;不同公司推出了几款产品。从谷歌拥有自己的 Bard AI&#xff0c;到微软发布新的 Bing AI Chat&#xff0c;再到 OpenAI 发布GPT-4。…

用gost实现远程端口映射

gost 是一个非常优秀的tunnel. 支持多种形式的端口映射。 本文只介绍远程端口映射方式的tunnel. 远程端口映射的意思就是&#xff0c;将本地端的某个服务的端口A&#xff08;tcp/udp&#xff09;映射到远程的某个端口P上&#xff0c; 用户通过访问远程的端口P来访问本地端的这…

生态碳汇涡度通量数据分析

生态碳汇涡度相关监测与通量数据分析 朱老师&#xff08;副教授&#xff09;&#xff1a;来自国内重点高校&#xff0c;长期从事涡度通量观测与分析研究&#xff0c;发表SCI论文多篇&#xff0c;主持国家与地方科研项目多个&#xff0c;在生态环境数据处理与分析中具有丰富的实…

Fourier分析入门——第3章——离散函数的Fourier分析

目录 第 3 章 离散函数的Fourier分析 3.1 引言 3.2 在1点采样的函数 3.3 在2点采样的函数 3.4 Fourier分析是一种线性变换 3.5 Fourier分析是一种基向量的变更 3.6 在3点采样的函数 3.7 在D点采样的函数 3.8 整理(tidying up) 3.9 Parseval[p:zeifa:l]定理 3.10 关联…

【LeetCode】203,移除链表元素。 难度等级:简单。链表入门题目,值得深入研究。

文章目录 一、题目二、解答&#xff1a;迭代法&#xff0c;引入一个新的头结点三、难点解释 【LeetCode】203&#xff0c;移除链表元素。 难度等级&#xff1a;简单。 本题是链表入门题目&#xff0c;值得深入研究。 一、题目 二、解答&#xff1a;迭代法&#xff0c;引入一个…

Spring实现IOC和DI入门案例(XML版)

文章目录 1 IOC入门案例(XML版)1.1 思路分析1.2 代码实现步骤1:创建Maven项目步骤2:添加Spring的依赖jar包步骤3:添加案例中需要的类步骤4:添加spring配置文件步骤5:在配置文件中完成bean的配置步骤6:获取IOC容器步骤7:从容器中获取对象进行方法调用步骤8:运行程序 2 DI入门案例…

【差分+操作】C. Helping the Nature

Problem - 1700C - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始手玩了一下 如果不是高低高的形式&#xff0c;那么一定不能通过操作3把全部元素变成0 因此就是先把所有元素变成高低高的形式 但是低在什么地方不确定 因此考虑枚举中间低谷位置&#xff0c;O(1)计…

ShardingSphere-JDBC整合SpringBoot JPA读写分离失败

问题 最近在整合ShardingSphere JDBC和Spring Boot的时候遇到一个问题,当ORM框架使用JPA时,读写分离会失效,查询仍然走主库并不会走从库!同样的配置使用Mybatis就没有任何问题。 在查阅各种资料后,初步确定未JPA事务问题 ShardingSphere负载均衡算法 我当前使用的版本是…

【历史上的今天】4 月 23 日:YouTube 上传第一个视频;数字音频播放器的发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 23 日&#xff0c;世界读书日。在 1564 年的这一天&#xff0c;全世界最卓越的文学家之一莎士比亚出生&#xff1b;1616 年的这一天&#xff0c;莎士比亚…

shell脚本5数组

文章目录 数组1 数组定义方法2 获取数组长度2.1 读取数组值2.2 数组切片2.3 数组替换2.4 数组删除2.5 追加数组元素 3 实验3.1 冒泡法3.2 直接选择法3.3 反排序法 数组 1 数组定义方法 数组名(value0 valuel value2 …) 数组名( [0]value [1]value [2]value …) 列表名“val…

现在的00后,实在是太卷了,我们这些老油条都想辞职了......

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快要超过我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家…

真题详解(传引用)-软件设计(七十五)

真题详解&#xff08;补码转换&#xff09;-软件设计&#xff08;七十四)https://blog.csdn.net/ke1ying/article/details/130674214 分治算法技术设计______。 答案&#xff1a;1、问题划分 2、递归求解 3、合并解 虚拟存储体系_____两级构成。 解析&#xff1a;主存 和 辅…

linux环境安装使用tomcat详解

01-安装Tomcat # 0.下载tomcat http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.46/bin/apache-tomcat-8.5.46.tar.gz # 1.通过工具上传到Linux系统中 # 2.解压缩到/usr目录中 [rootlocalhost ~]# tar -zxvf apache-tomcat-8.5.46.tar.gz -C /usr/ -C 用来指…

【AI绘图 丨 Midjourney 系列教程二】— 初识超火的AI绘画神器Midjourney

今天起&#xff0c;由 Midjourney 打头阵&#xff0c;让我们开始共同探索一系列的 AI 领域革命性作品&#xff0c;包括 Midjourney、Stable Diffusion、ChatGPT 等等&#xff0c;学习这些新时代的魔法和它的咒语。 写在前面 官方文档是最好的入门课程。相较于市面上琳琅满目的…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类&#xff1a;第一类是经典以太网&#xff0c;第二类是交换式以太网&#xff0c;使用了一种称为交换机的设备连接不同的计算机。 经典以太网&#xff1a;是以太网的原始形式&#xff0c;运行速度从 …

信创办公–基于WPS的EXCEL最佳实践系列 (宏的录制)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;宏的录制&#xff09; 目录 应用背景操作步骤1、宏的录制启用2、宏的使用3、宏的保存4、宏的禁用 应用背景 宏是一个自动化完成重复性工作的工具&#xff0c;使用宏可以提高我们的工作效率&#xff0c;那应该怎样使用宏这一…

ArcSWAT报错:Error Number :-2147467259; 对 COM 组件的调用返回了错误 HRESULT E_FAIL

文章目录 1 报错内容2 报错解决3 并行处理的设置补充说明 1 报错内容 通常为连续两段报错&#xff1a; Error Number :-2147467259 Error Message :对 COM 组件的调用返回了错误 HRESULT E_FAIL 。 Module name : mSWFlow Function name : createStream Procedure ( error li…