1 #include <iostream>
2 //1.模板类继承普通类
3
4 class A
5 {
6 public:
7 int m_a;
8 A(int a) :m_a(a)
9 {
10 std::cout << "普通类A的构造函数" << std::endl;
11 }
12 };
13
14 template<class T>
15 class B:public A //这里模板类继承普通类A 因为普通类A没有定义默认无参构造函数 ,所以这里只要把基类的构造函数参数传递好就行了
16 {
17 public:
18 T m_b;
19 B(T b,int a):A(a),m_b(b)//传递参数a给基类构造函数
20 {
21 std::cout << "模板类B的构造函数" << std::endl;
22 }
23 };
24 //-----------------------------------------------------------------------
25 #include <iostream>
26
27 //4.模板类继承模板类
28
29 template<class TB>
30 class B
31 {
32 public:
33 TB m_b;
34 B(TB b):m_b(b)//传递参数a给基类构造函数
35 {
36 std::cout << "模板类B的构造函数->" <<m_b<< std::endl;
37 }
38 };
39
40 //原模板类 A 的模板类型为template<class TA> 要继承模板类B 只需将类B的模模参数添加上 再将类B的构造函数参数传递好就行了.
41 template<class TA, class TB>
42 class A:public B<TB>
43 {
44 public:
45 TA m_a;
46 A(TA a,TB b) :B<TB>(b),m_a(a) //注意这里调用基类构造函数时 类B为模板类 所以他的实际类型为B<T>
47 {
48 std::cout << "普通类A的构造函数->" << m_a << std::endl;
49 }
50 };
51
52
53
54 int main()
55 {
56 A<int,std::string> a(10, "我是模板类的参数"); //这里创建对像时 一定要将自身的模板类型和基类的模板类型 显示定义
57 return 0;
58 }
59
60
61 int main()
62 {
63 B<int> b(10,1);
64 return 0;
65 }
66 //----------------------------------------------------------------
67 #include <iostream>
68
69 //2.普通类继承模板类的具体化版本
70
71 template<class T>
72 class B
73 {
74 public:
75 T m_b;
76 B(T b):m_b(b)//传递参数a给基类构造函数
77 {
78 std::cout << "模板类B的构造函数" <<m_b<< std::endl;
79 }
80 };
81
82 class A:public B<int>
83 {
84 public:
85 int m_a;
86 A(int a,int b) :B(b),m_a(a)
87 {
88 std::cout << "普通类A的构造函数" << m_a << std::endl;
89 }
90 };
91
92
93
94 int main()
95 {
96 A a(10, 1);
97 return 0;
98 }
99
100 //-----------------------------------------------------------------------
101 #include <iostream>
102
103 //3.普通类继承模板类的完全模板化版本
104
105 template<class T>
106 class B
107 {
108 public:
109 T m_b;
110 B(T b):m_b(b)//传递参数a给基类构造函数
111 {
112 std::cout << "模板类B的构造函数->" <<m_b<< std::endl;
113 }
114 };
115
116 //这里因为普通类要继承模版类模板化 就要先定义一个基类一样的类模板
117 template<class T>
118 class A:public B<T>
119 {
120 public:
121 int m_a;
122 A(int a,T b) :B<T>(b),m_a(a) //注意这里调用基类构造函数时 类B为模板类 所以他的实际类型为B<T>
123 {
124 std::cout << "普通类A的构造函数->" << m_a << std::endl;
125 }
126 };
127
128
129
130 int main()
131 {
132 A a(10, "我是模板类的参数");
133 return 0;
134 }
135
136 //-----------------------------------------------------------------------
137 #include <iostream>
138
139 //5.模板类继承模板参数给出的基类
140
141 class A
142 {
143 public:
144 int m_a;
145 A(int a) :m_a(a)
146 {
147 std::cout << "普通类A的构造函数->" << m_a << std::endl;
148 }
149 };
150
151 template <class TB>
152 class B
153 {
154 public:
155 TB m_b;
156 B(TB b) :m_b(b)
157 {
158 std::cout << "模板类B的构造函数->" << m_b << std::endl;
159 }
160 };
161
162 template <class T>
163 class C :public T //注意 这里 基类 用模板定义
164 {
165 public:
166 int m_c;
167 C(int c):T(c),m_c(c) //这里用模板T 来调用基类构造函数
168 {
169 std::cout << "类C的构造函数->" << m_c << std::endl;
170 }
171 };
172
173 template <class TD,class T,class TT>
174 class D :public T //注意 这里 基类 用模板定义 自身又是一个模板类
175 {
176 public:
177 TD m_d;
178 D(TD d,TT tt) :T(tt), m_d(d) //这里用模板T 来调用基类构造函数
179 {
180 std::cout << "模板类D的构造函数->" << m_d << std::endl;
181 }
182 };
183
184
185
186
187 int main()
188 {
189 C<A> e1(1);
190 C<B<char>> e2(48);
191 D<int,B<std::string>,std::string> d1(1,"我是一个字符串");
192 return 0;
193 }