C++模版:类模版的继承

372 阅读1分钟

如果父类是类模版,子类有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

阅读原文,关注[空与一]