#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
- Правильно ли я создаю подкласс Cmybase_form?
- Правильно ли я использую подкласс 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;
}
Пожалуйста, вернитесь назад, если он не удовлетворяет вашим требованиям. Мы будем работать над этим.