C++ C++;从模板类派生

C++ C++;从模板类派生,c++,inheritance,C++,Inheritance,我正在尝试创建以下内容的子类: template < class THandler, class ThreadModel = CComSingleThreadModel, class TagReplacerType = CHtmlTagReplacer< THandler > > class CRequestHandlerT : public TagReplacerType, public CComObjectRootEx< T

我正在尝试创建以下内容的子类:

template <
   class THandler,
   class ThreadModel     = CComSingleThreadModel,
   class TagReplacerType = CHtmlTagReplacer< THandler >
>
class CRequestHandlerT :
   public TagReplacerType,
   public CComObjectRootEx< ThreadModel >,
   public IRequestHandlerImpl< THandler >
模板<
坦德勒阶级,
类别ThreadModel=CComSingleThreadModel,
类TagReplacerType=CHtmlTagReplacer
>
等级CRequestHandlerT:
公共标记替换类型,
公共CComObjectRootEx,
公共IRequestHandlerImpl
如果按以下方式使用,则上述类别的工作效果最佳:

class Cmy_form : public CRequestHandlerT<Cmy_form>
Cmy\U类表格:公共凭证
但我正在尝试创建一个子类(通过添加额外的成员函数来扩展CRequestHandlerT功能):

class-Cmybase\u格式:public-CRequestHandlerT{…};
类Cmy_表单:公共Cmybase_表单{…};//生成但运行时错误
  • 我是否正确地将Cmybase\u表单子类化
  • 我使用的子类Cmy\u表单是否正确

  • 根据我的理解,我已经写了一些代码,它工作得很好。如果我误解了你的要求,请告诉我

    #include <iostream>
    using namespace std;
    
    template <class T>
    class tbase {
        public:
        tbase () {}
        ~tbase () {}
        virtual bool my_print (T value) 
        {
            cout << "Value passed is: " << value << endl;
        }
    
        virtual void print ()
        {
            cout << "TBASE" << endl;
        }
    };
    
    
    template <class T>
    class mbase : public tbase<T>
    {
        public:
        mbase ()
            : tbase<T>()
        {}
    
        virtual void print ()
        {
            cout << "MBASE" << endl;
        }
    };
    
    template <class T>
    class child : public mbase <T>
    {
        public:
        child ()
            : mbase<T> ()
        {}
    
        virtual void print ()
        {
            cout << "CHILD" << endl;
        }
    };
    
    int main ()
    {
        tbase <int> * b = new child<int>;
        b->print();
        b->my_print( 10 );
    
        return 0;
    }
    
    #包括
    使用名称空间std;
    模板
    类数据库{
    公众:
    tbase(){}
    ~tbase(){}
    虚拟bool my_print(T值)
    {
    
    如果没有更多关于正在发生的错误的代码或信息,调试可能会非常困难。Ben,但是Cmybase_表单的语法如何?是否看起来我的派生不正确?我的目标是在Cmybase_表单中添加一个成员函数,并从中派生,而不是从CRequestHandlerT。你知道为什么需要CRTP吗?它很简单像
    CRequestHandlerT
    这样的ok将调用T的函数。因此,这导致了上面显示的两种形式的
    Cmy\u形式
    之间的巨大差异。如果
    CRequestHandlerT
    所需的
    T
    的所有函数都是虚拟的,我想你应该很好。你知道什么时候会发生运行时错误吗?也许是这样正在销毁
    Cmy_表单
    ,因为它没有虚拟析构函数?Pradham,你能给我一个例子,说明你如何将CRequestHandlerT子类化吗?我很困惑。@CarolineBeltran你想添加到
    Cmybase_表单
    的这个成员函数依赖于
    CRequestHandlerT
    ?换句话说,你能做
    吗>Cmybase类表格
    。和
    Cmy类表格:公共Cmybase类表格,CRequestHandlerT
    #include <iostream>
    using namespace std;
    
    template <class T>
    class tbase {
        public:
        tbase () {}
        ~tbase () {}
        virtual bool my_print (T value) 
        {
            cout << "Value passed is: " << value << endl;
        }
    
        virtual void print ()
        {
            cout << "TBASE" << endl;
        }
    };
    
    
    template <class T>
    class mbase : public tbase<T>
    {
        public:
        mbase ()
            : tbase<T>()
        {}
    
        virtual void print ()
        {
            cout << "MBASE" << endl;
        }
    };
    
    template <class T>
    class child : public mbase <T>
    {
        public:
        child ()
            : mbase<T> ()
        {}
    
        virtual void print ()
        {
            cout << "CHILD" << endl;
        }
    };
    
    int main ()
    {
        tbase <int> * b = new child<int>;
        b->print();
        b->my_print( 10 );
    
        return 0;
    }