C++模板类与继承

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

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

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

4)模板类继承模板类。

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

示例:

1)模板类继承普通类

复制代码
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

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

int main()
{
	BB<int, string> bb(8, "我是一只傻傻鸟。",3);
	bb.func2();
	bb.func1();
}

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

复制代码
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

template<class T1, class T2>
class BB      // 模板类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() const { cout << "调用了func2()函数:x = " << m_x << ", y = " << m_y << endl; }
};

class AA:public BB<int,string>     // 普通类AA。
{
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, "我是一只傻傻鸟。");
	aa.func1();
	aa.func2();
}

3)普通类继承模板类。

复制代码
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

template<class T1, class T2>
class BB      // 模板类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() const { cout << "调用了func2()函数:x = " << m_x << ", y = " << m_y << endl; }
};

template<class T1, class T2>
class AA:public BB<T1,T2>     // 普通类AA变成了模板类,才能继承模板类。
{
public:
	int m_a;
	AA(int a, const T1 x, const 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, "我是一只傻傻鸟。");
	aa.func1();
	aa.func2();
}

4)模板类继承模板类。

复制代码
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

template<class T1, class T2>
class BB      // 模板类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() const { cout << "调用了func2()函数:x = " << m_x << ", y = " << m_y << endl; }
};

template<class T1, class T2>
class AA:public BB<T1,T2>     // 普通类AA变成了模板类,才能继承模板类。
{
public:
	int m_a;
	AA(int a, const T1 x, const 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 << "调用了CC的构造函数。\n"; }
	void func3() { cout << "调用了func3()函数:m_a=" << m_a << endl;; }
};

int main()
{
	CC<int,int,string> cc(3,8, "我是一只傻傻鸟。");
	cc.func3();
	cc.func2();
}

5)模板类继承模板参数给出的基类\

复制代码
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。

class AA {
public:
    AA()         { cout << "调用了AA的构造函数AA()。\n"; }
    AA(int a) { cout << "调用了AA的构造函数AA(int a)。\n"; }
};

class BB {
public:
    BB()         { cout << "调用了BB的构造函数BB()。\n"; }
    BB(int a) { cout << "调用了BB的构造函数BB(int a)。\n"; }
};

class CC {
public:
    CC()         { cout << "调用了CC的构造函数CC()。\n"; }
    CC(int a) { cout << "调用了CC的构造函数CC(int a)。\n"; }
};

template<class T>
class DD {
public:
    DD()         { cout << "调用了DD的构造函数DD()。\n"; }
    DD(int a) { cout << "调用了DD的构造函数DD(int a)。\n"; }
};

template<class T>
class EE : public T {          // 模板类继承模板参数给出的基类。
public:
    EE() :T()           { cout << "调用了EE的构造函数EE()。\n"; }
    EE(int a) :T(a) { cout << "调用了EE的构造函数EE(int a)。\n"; }
};

int main()
{
    EE<AA> ea1;                 // AA作为基类。
    EE<BB> eb1;                 // BB作为基类。
    EE<CC> ec1;                 // CC作为基类。
    EE<DD<int>> ed1;      // EE<int>作为基类。
    // EE<DD> ed1;                // DD作为基类,错误。
}

推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/3Zqhgt

相关推荐
-凌凌漆-6 分钟前
【QML】qml和C++中同时使用单例模式
java·c++·单例模式
6Hzlia7 分钟前
【Hot 100 刷题计划】 LeetCode 101. 对称二叉树 | C++ DFS 极简递归模板
c++·leetcode·深度优先
誰能久伴不乏7 分钟前
Qt 混合编程核心原理:C++ 与 QML 通信机制详解
linux·c++·qt·架构·状态模式
ximu_polaris24 分钟前
设计模式(C++)-结构型模式-享元模式
c++·设计模式·享元模式
Hello!!!!!!25 分钟前
C++基础(五)——屏幕和文件输入输出
开发语言·c++·算法
ytttr87327 分钟前
C++ LZW 文件压缩算法实现
开发语言·c++
王老师青少年编程41 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:加工生产调度
c++·算法·贪心·csp·信奥赛·排序贪心·加工生产调度
小菜鸡桃蛋狗1 小时前
C++——vector
开发语言·c++·算法
少司府1 小时前
C++基础入门:初识模板
开发语言·c++·c·模板·函数模板·类模板·泛型编程
十五年专注C++开发1 小时前
C++中TAS和CAS实现自旋锁
c++·cas·原子操作·tas