模板类与继承

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

cpp 复制代码
#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。

cpp 复制代码
#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构造函数的初始化列表中指明基类的构造函数。

cpp 复制代码
#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;
}
cpp 复制代码
调用了AA的构造函数
调用了BB的构造函数,
调用了func2()函数:x = 8 ,y = zhongge
调用func1()函数 :m_a = 3

C:\Users\代伟业\Desktop\C++\初始化列表\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe (进程 19556)已退出,代码为 0。
按任意键关闭此窗口. . .

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

cpp 复制代码
#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;
}
cpp 复制代码
调用了BB的构造函数,
调用了AA的构造函数
调用了func2()函数:x = 8 ,y = zhongge
调用func1()函数 :m_a = 3

C:\Users\代伟业\Desktop\C++\初始化列表\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe (进程 7360)已退出,代码为 0。
按任意键关闭此窗口. . .

3普通类继承模板类

cpp 复制代码
#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模板类继承模板类。

cpp 复制代码
#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模板类继承模板参数给出的基类(不能是模板类)

cpp 复制代码
#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;
}
相关推荐
KJ_BioMed30 分钟前
从PDB到高亲和力分子:De novo生成式计算化学Pipeline剖析
算法·生物医药·生物科研·科研干货·化合物设计
一个王同学1 小时前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm
jimy12 小时前
C语言模拟对象、方法:“函数指针+结构体“复用函数指针指向的函数体
c语言·开发语言
天外天-亮2 小时前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
木木子222 小时前
[特殊字符] 音乐播放器——状态驱动的多媒体控制
android·开发语言·华为·php·harmonyos
旖-旎3 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~3 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎3 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
六个九十度3 小时前
用python脚本访问被网关隔离的嵌入式设备
开发语言·python
拂拉氏3 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树