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