C является производным от класса шаблона

#c #inheritance

#c #наследование

Вопрос:

Я пытаюсь создать подкласс следующего:

 template <
   class THandler,
   class ThreadModel     = CComSingleThreadModel,
   class TagReplacerType = CHtmlTagReplacer< THandler >
>
class CRequestHandlerT :
   public TagReplacerType,
   public CComObjectRootEx< ThreadModel >,
   public IRequestHandlerImpl< THandler >
  

Приведенный выше класс отлично работает, если используется следующим образом:

 class Cmy_form : public CRequestHandlerT<Cmy_form>
  

Но я пытаюсь создать подкласс (чтобы расширить функциональность CRequestHandlerT, добавив дополнительную функцию-член):

 class Cmybase_form : public CRequestHandlerT<Cmybase_form> {...};

class Cmy_form : public Cmybase_form {...};    // builds but runtime error
  
  1. Правильно ли я создаю подкласс Cmybase_form?
  2. Правильно ли я использую подкласс Cmy_form?

Комментарии:

1. Будет довольно сложно отлаживать без дополнительного кода или информации о возникшей ошибке.

2. Бен, но как насчет синтаксиса Cmybase_form? Похоже ли, что я неправильно извлекаю? Моя цель — добавить функцию-член в Cmybase_form и наследовать от нее, а не от CRequestHandlerT.

3. Вы знаете, зачем вам нужен CRTP? Похоже, что CRequestHandlerT<T> будут вызываться функции T. Таким образом, это приводит к большой разнице между двумя формами Cmy_form , показанными выше. Если все функции, T необходимые CRequestHandlerT , являются виртуальными, я думаю, у вас все должно быть хорошо. Есть ли у вас какие-либо идеи, когда возникает ошибка во время выполнения? Возможно, это при уничтожении Cmy_form , потому что у него нет виртуального деструктора?

4. Прадхам, можете ли вы привести мне пример того, как вы бы подклассили CRequestHandlerT? Я очень смущен.

5. @CarolineBeltran Cmybase_form зависит ли от CRequestHandlerT этой функции-члена, которую вы хотите добавить? Другими словами, вы можете сделать class Cmybase_form . И class Cmy_form : public Cmybase_form, CRequestHandlerT<Cmy_form> ?

Ответ №1:

Я написал некоторый код, основанный на моем понимании, и он работает нормально. Пожалуйста, дайте мне знать, если я неправильно понял ваше требование.

 #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;
}
  

Пожалуйста, вернитесь назад, если он не удовлетворяет вашим требованиям. Мы будем работать над этим.