如果父类是类模版,子类有2种方式继承父类:
- 指定具体类型,继承父类实例化类
- 子类可以定义成普通类
- 子类也可以定义成模版类
- 子类继承父类模版,子类必须定义成模版类,将模版参数传给父类
第1种情况:
Apple1
是普通类,继承模版实例化类Fruit<int>
Apple2
是模版类,继承模版实例化类Fruit<int>
template <typename T>
class Fruit {
public:
Fruit();
};
template <typename T>
Fruit<T>::Fruit() {
std::cout << "fruit template type :" << typeid(T).name() << std::endl;
}
class Apple1 : Fruit<int> {
public:
Apple1();
};
Apple1::Apple1() {
std::cout << "Apple1 is not template" << std::endl;
}
template <typename T>
class Apple2 : Fruit<int> {
public:
Apple2();
};
template <typename T>
Apple2<T>::Apple2() {
std::cout << "Apple2 template type :" << typeid(T).name() << std::endl;
}
// 测试代码
void test7() {
Apple1 a1;
Apple2<double> a2;
}
下面是测试代码运行结果:
fruit template type :i
Apple1 is not template
fruit template type :i
Apple2 template type :d
第2种情况:
子类Apple3
是模版类,父类Fruit
也是模版类。如果使用某个具体类型实例化子类,父类也会使用同样的类型。
template <typename T>
class Apple3 : Fruit<T> {
public:
Apple3();
};
template <typename T>
Apple3<T>::Apple3() {
std::cout << "Apple3 template type :" << typeid(T).name() << std::endl;
}
void test8() {
Apple3<long> a3;
}
下面是测试代码运行结果:
fruit template type :l
Apple3 template type :l
阅读原文,关注公众号[空与一]