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

本文探讨了C++中类模板的继承问题,包括两种方式:一是子类作为普通类或模板类继承模板实例化类;二是子类作为模板类继承模板类,并在实例化时传递模板参数给父类。文章通过测试代码展示了这两种情况的运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值