模板类的继承
1)类模板 继承 类模板
(2)类模板 继承 模板类
(3)类模板 继承 普通类
(4)普通类 继承 模板类
单模板参数,类模板继承类模板,代码实现
//作为父类
template <typename T>
class People {private:/* data */int age;public:T x;People() {} // Default constructorPeople(T a) : x(a) {}void myprint(const People<T>& pn);
};template <typename T>
void People<T>::myprint(const People<T>& pn) {cout << "pn.x=" << pn.x << endl;
}template <typename T>
class Man : public People<T> {private:/* data */public:T y;Man() {} // Default constructorMan(T a) : y(a) {}Man(T a, T b) : People<T>(a), y(b) {}
};void test070802(void) {People<int> p1(10);p1.myprint(p1);Man<int> m1(88, 99);m1.myprint(m1);cout << "m1.x=" << m1.x << endl;cout << "m1.y=" << m1.y << endl;
}
总结:在继承时,相当于用子类的模板参数Tx去实例填充了父类的模板参数Ty
作用:用于构建模板化的类体系,写模板化的大框架
//作为父类
template <typename T>
class People {private:/* data */int age;public:T x;People() {} // Default constructorPeople(T a) : x(a) {}void myprint(const People<T>& pn);
};template <typename T>
void People<T>::myprint(const People<T>& pn) {cout << "pn.x=" << pn.x << endl;
}template <typename T1>
class Man : public People<T1> {private:/* data */public:T1 y;Man() {} // Default constructorMan(T1 a) : y(a) {}Man(T1 a, T1 b) : People<T1>(a), y(b) {}
};void test070802(void) {People<int> p1(10);p1.myprint(p1);Man<int> m1(88, 99);m1.myprint(m1);cout << "m1.x=" << m1.x << endl;cout << "m1.y=" << m1.y << endl;
}
多模板参数
//作为父类
template <typename T1, typename T2>
class People {private:/* data */int age;public:T1 x1;T2 x2;People() {} // Default constructorPeople(T1 a, T2 b) : x1(a), x2(b) {}void myprint(const People<T1, T2>& pn);
};template <typename T1, typename T2>
void People<T1, T2>::myprint(const People<T1, T2>& pn) {cout << "myprint.x1=" << pn.x1 << endl;cout << "myprint.x2=" << pn.x2 << endl;
}template <typename T9, typename T8>
class Man : public People<T8, T9> { //报错 1和 2 一起就不会报错// class Man : public People<T9, T8> { // 3private:/* data */public:T9 y1;T8 y2;Man() {} // Default constructorMan(T9 a) : y1(a) {}Man(T9 a, T8 b): People<T8, T9>(b, a), y1(b), y2(a) {} //报错 2 和 1 一起就不会报错// Man(T9 a, T8 b) : People<T9, T8>(b, a), y1(b), y2(a) {}//OK 4 和 3 一起就不会报错// Man(T9 a, T8 b) : People<T9, T8>(a, b), y1(b), y2(a) {} // OK 5 和 3 一起就不会报错
};void test070802(void) {Man<int, double> m1(66.66, 99.99);cout << "m1.x1=" << m1.x1 << endl;cout << "m1.x2=" << m1.x2 << endl;cout << "m1.y1=" << m1.y1 << endl;cout << "m1.y2=" << m1.y2 << endl;Man<double, double> m2(66, 99.99);cout << "m2.x1=" << m2.x1 << endl;cout << "m2.x2=" << m2.x2 << endl;cout << "m2.y1=" << m2.y1 << endl;cout << "m2.y2=" << m2.y2 << endl;
}
本质上要理解模板的对应关系
类模板 继承 模板类(类的成员函数/变量有使用模板)
类模板 继承 普通类 (类的成员函数和变量都没有使用模板)
普通类 继承 模板类
学习记录,侵权联系删除。
来源:朱老师物联网大课堂