Является ли базовый базовый класс законным? - PullRequest
4 голосов
/ 16 февраля 2012

Кажется, это работает, но я не уверен на 100%, что это законно, и был бы признателен за некоторую обратную связь.

У меня есть подкласс, производный от базового базового класса.Это похоже на странно повторяющийся шаблон, но отличается.

В производном.h:

template <class T>
class Derived : public T
{
public:
    Derived();
... and some other stuff ...
};

В производном.cpp:

#include "derived.h"

template <class T>
Derived<T>::Derived()
{
    ...
}

// defining the variations I need here avoids linker errors
// see http://www.parashift.com/c++-faq-lite/templates.html#faq-35.13
template Derived<Base1>::Derived();
template Derived<Base2>::Derived();

И в некоторых другихфайл:

#include "derived.h"

void test()
{
    Derived<Base1> d1;
    Derived<Base2> d2;
    ... do stuff with d1 and d2 ...
}

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

В C ++ нет такого понятия, как «универсальный класс».У вас есть шаблон , а шаблон - это не класс.Скорее, экземпляры шаблона становятся классами.Однако это совершенно разные, отдельные и несвязанные классы, поэтому Derived<A> и Derived<B> не имеют ничего общего друг с другом.

Кроме того, то, что вы делаете, прекрасно.В любом данном шаблоне экземпляр Derived<T>, T является действительным классом (предполагая, что является на самом деле классом, а не, скажем, массивом или int)и вы можете извлечь из этого.

5 голосов
/ 16 февраля 2012

Да, вы можете наследовать от любого класса, включая тот, который является (или зависит от) аргументом шаблона.

Как отмечено в комментариях, это должен быть полный тип; то есть он должен быть определен до создания шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...