c++类父类模板化template<class T> class Derived:public T{}

第一次看到这个是懵逼的:
后来发现是 基类模板
https://zhuanlan.zhihu.com/p/106672814?utm_source=wechat_session

template<typename Parent>
class FrameInternal : public Parent{
public:
    typedef std::shared_ptr<FrameInternal> Ptr;
    FrameInternal(const Frame::Ptr &parent_frame, char *ptr, size_t size, size_t prefix_size)
            : Parent(ptr, size, parent_frame->dts(), parent_frame->pts(), prefix_size) {
        _parent_frame = parent_frame;
    }
    bool cacheAble() const override {
        return _parent_frame->cacheAble();
    }
private:
    Frame::Ptr _parent_frame;
};

简化一下变成下面这种方式


class A{
A(){}
~A(){}
}

class B{
B(int x):a(x){}
~B(){}
private:
int a;
}

class C{
C(int a ,char ):a(a),b(b){}
~C(){}
private:
int a;
char b;
}
template<class T>
class Derived:public T{
public:
    Derived():T(){cout<<"Derived founed"<<endl;}
    Derived(int a):T(a){cout<<"Derived founed"<<endl;}
     Derived(int a,char b):T(a,b){cout<<"Derived founed"<<endl;}
     //上述很麻烦吧
     template<typename ...ArgsType>
    Derived(ArgsType &&...args):T(std::forward<ArgsType>(args)...){}
    //这样是不是更加简单了呢
};
这种方式呢可以减少代码,通过构造函数来确定不同的父类,通过三个不同的构造就可以确定三个不同的父类
Derived<A> a;
Derived<B> b;
Derived<C> c;
实例化的时候分别调用三个不同的构造函数

一个类模板不仅可以从另一个类模板中导出,也可以从一个普通类导出,当然普通类也可以继承一个模板类;
也就是说,普通类和模板类可以构成四种继承关系。
https://zhuanlan.zhihu.com/p/106672814?utm_source=wechat_session
class Box {...};

class Box : public Apple {...};

class Box : public Orange {...};

class Box : public Banana {...};
template<class T>
class Box:public T{
//内部通过构造函数进行区分即可
//具体看上面的例子
}
......


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在代码中有两个错误需要修复: 1. 在类 Any 的 Base 结构体中定义了一个纯虚析构函数 `virtual ~Base() = 0;`,但没有提供定义。这会导致编译错误。你可以将这个函数改为默认的虚析构函数 `virtual ~Base() = default;`。 2. 在 Any 类的模板构造函数中,使用了 unique_ptr<Base> 的初始方式 new Data<T>(data),但没有进行类型检查。这可能会导致运行时错误,因为无法保证传入的类型 T 能够被正确转换为 Base 类型。你可以使用 type_traits 来进行类型检查,确保传入的类型 T 是派生自 Base 类型的。 下面是修改后的代码: ```cpp #include <iostream> #include <vector> #include <memory> #include <type_traits> using namespace std; class Any { struct Base { virtual ~Base() = default; }; template <class E> struct Data : public Base { Data(E data) : value(data) {} E value; }; unique_ptr<Base> base; public: template <typename T> Any(T data) : base(new typename enable_if<is_base_of<Base, T>::value, Data<T>>::type(data)) {} template <typename V> V _Cast() { if (auto derived = dynamic_cast<Data<V>*>(base.get())) { return derived->value; } else { // 处理转换失败的情况,例如抛出异常或返回默认值 // 这里简单地返回默认值 return V{}; } } }; int main() { Any a = 5; return 0; } ``` 在修改后的代码中,我添加了 `<type_traits>` 头文件来使用 `enable_if` 和 `is_base_of`,以确保传入的类型 T 是派生自 Base 类型的。在模板构造函数中使用了 `enable_if`,如果传入的类型 T 不满足 `is_base_of<Base, T>::value`,则编译错误。 在 _Cast 函数中,我添加了一个条件判断来处理 dynamic_cast 的转换失败情况。如果 dynamic_cast 成功,返回转换后的值;如果转换失败,可以根据实际需求进行处理,例如抛出异常或返回默认值。 这样就修复了代码中的错误,并添加了一些防御性的修改。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值