类模板继承和部分具体化例子及非类型参数

简介: 模板类必须所有的方法定义放到一个文件中。因为模板类不是函数不能单独编译 template class myext:public mybase 模板定义两个类型参数T1,T2,定义个非类型参数T3,他在使用期间如同一个常数。
模板类必须所有的方法定义放到一个文件中。因为模板类不是函数不能单独编译

template<typename T1,typename T2,int T3>
class myext:public mybase<T2>
模板定义两个类型参数T1,T2,定义个非类型参数T3,他在使用期间如同一个常数。这个T3可以用来处理动态数组,并且继承了模板类mybase并且将类型参数T2赋予给他
template<typename T2,int T3>
class myext<int,T2,T3>:public mybase<T2>
模板定义一个类型参数T2,定义一个非类型参数T3,那么这里的T2就代表他是泛型的,而不具体化,但是开始的T1变为了具体化的int, 并且继承了模板类mybase并且将类型参数T2赋予给他

template<typename T1,typename T2,int T3>
void myext<T1,T2,T3>::set(const T1 &in)
这是第一个模板类定义方法的方法

template<typename T2,int T3>
void myext<int,T2,T3>::set(const int &in)
这是第二个模板类定义方法的方法

调用:
myext<string,string,4> test2("test","gaopeng"); 将匹配 template<typename T1,typename T2,int T3>  class myext:public mybase<T2>
myext<int,int,10> test1(1,1); 将匹配 template<typename T2,int T3>  class myext<int,T2,T3>:public mybase<T2>
具体化过后当然选择的方法是选择匹配程度最高的模板。
下面是具体的测试代码没有实际意义:


点击(此处)折叠或打开

  1. 头文件
  2. tmp.h
  3. #include<iostream>
  4. using namespace std;

  5. template<typename T1>
  6. class mybase
  7. {
  8.         private:
  9.                 T1 a;
  10.         public:
  11.                 mybase(T1 in)
  12.                 {
  13.                         a=in;
  14.                 }
  15.                 virtual void show(void) const
  16.                 {
  17.                         cout<<a<<endl;
  18.                 }
  19.                 virtual ~mybase(){}
  20. };

  21. template<typename T1,typename T2,int T3>
  22. class myext:public mybase<T2>
  23. {
  24.         private:
  25.                 T1 b;
  26.         public:
  27.                 myext(T1 in1,T2 in2):mybase<T2>(in2)
  28.         {
  29.                 b=in1;
  30.         }
  31.                 virtual void show(void) const
  32.                 {
  33.                         for(int i=0;i<T3;i++)
  34.                         cout<<b<<endl;
  35.                         mybase<T2>::show();
  36.                 }
  37.                 virtual ~myext(){}

  38.                 virtual void set(const T1&);
  39. };

  40. template<typename T1,typename T2,int T3>
  41. void myext<T1,T2,T3>::set(const T1 &in)
  42. {
  43.         b=in;
  44.         for(int m=0;m<T3;m++)
  45.         {
  46.                 cout<<"test"<<endl;
  47.         }
  48. }

  49. template<typename T2,int T3>
  50. class myext<int,T2,T3>:public mybase<T2>
  51. {
  52.         private:
  53.                 int b;
  54.         public:
  55.                 myext(int in1,T2 in2):mybase<T2>(in2)
  56.         {
  57.                 b=in1+100;
  58.         }
  59.                 virtual void show(void) const
  60.                 {
  61.                         for(int i=0;i<T3;i++)
  62.                                 cout<<b<<endl;
  63.                         mybase<T2>::show();
  64.                 }
  65.                 virtual ~myext(){}
  66.                 virtual void set(const int&);
  67. };
  68. template<typename T2,int T3>
  69. void myext<int,T2,T3>::set(const int &in)
  70. {
  71.         b=in+100;
  72.         for(int m=0;m<T3;m++)
  73.         {
  74.                 cout<<"test1"<<endl;
  75.         }
  76. }


点击(此处)折叠或打开

  1. main函数

  2. #include<iostream>
  3. #include"tmp.h"
  4. using namespace std;


  5. int main(void)
  6. {
  7.         cout<<"use specialization template"<<endl;
  8.         myext<int,int,10> test1(1,1);
  9.         test1.set(10);
  10.         test1.show();
  11.         cout<<"use general template"<<endl;
  12.         myext<string,string,4> test2("test","gaopeng");
  13.         test2.show();
  14. }
输出:
use specialization template
test1
test1
test1
test1
test1
test1
test1
test1
test1
test1
110
110
110
110
110
110
110
110
110
110
1
use general template
test
test
test
test
gaopeng

相关文章
|
存储 编译器 程序员
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
|
6月前
|
C++
C++类和类模板——入门
C++类和类模板——入门
45 1
|
6月前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。
|
存储 算法 安全
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
|
安全 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)上
[C++] 类与对象(中)类中六个默认成员函数(1)上
|
7月前
|
存储 程序员 编译器
【C++ 模板类与虚函数】解析C++中的多态与泛型
【C++ 模板类与虚函数】解析C++中的多态与泛型
186 0
类模板和继承
类模板和继承
53 0
|
存储 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)下
[C++] 类与对象(中)类中六个默认成员函数(1)下
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
557 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
C#编程-105:泛型继承之泛型类继承普通类
C#编程-105:泛型继承之泛型类继承普通类
104 0
C#编程-105:泛型继承之泛型类继承普通类