Как наследовать шаблонный базовый класс? - PullRequest
0 голосов
/ 15 апреля 2011


Я новичок в STL. Я написал шаблонный базовый класс следующим образом

template <class T>  
class Base  
{  
    public:    
    //Constructor and Destructor ..  
    Base();  
    virtual ~Base();  
    virtual foo() = 0;  
};  

Теперь я хочу спроектировать мою среду таким образом, чтобы мои унаследованные классы были публично получены из этого класса и реализовали foo в своих соответствующих реализациях. Проблема в том, что я не знаю, как наследовать от класса Template Base? Это как ниже ...

template class<T>  
class Derived : public Base<T>  
{ 
  // Implementation of Derived constructor etc and methods ...  
};  

или нормальный путь C ++

class Derived : public Base  
{  
};  

Есть предложения? Кроме того, я был бы признателен за любую информацию для начала работы с STL для новичков, как я ...

С уважением,
Атул

Ответы [ 4 ]

5 голосов
/ 15 апреля 2011

Позднее

class Derived : public Base

будет не работать, потому что Base - это не класс, это шаблон класса.Чем это зависит от того, должен ли Derived быть шаблоном или он должен наследовать конкретный экземпляр Base:

  • Шаблон:

    template<typename T>
    class Derived : public Base<T>
    
  • Не шаблон:

    class Derived : public Base<Something>
    

    (где Something - это конкретный тип, например int или char * или std::string)

1 голос
/ 15 апреля 2011

Либо

template class<T>  
class Derived : public Base<T>  
{ };

, если вы хотите, чтобы Derived работал с Base<> s любого типа.

Или

class Derived : public Base<SomeSpecificType>
{ };

, если хотите Derived для работы только с определенным типом Base<>.

0 голосов
/ 15 апреля 2011

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

template<typename T>
class Derived : public Base<Something>  // Something is some concrete type

или

template<typename T, typename U>
class Derived : public Base<U>
0 голосов
/ 15 апреля 2011

Ваш второй пример - путь.

template class<T>   
public Base<T>   
{    // Implementation of Base constructor etc and methods ...   
}; 


template class<T>   
class Derived : public Base<T>   
{    // Implementation of Derived constructor etc and methods ...   
public:
    Derived() : Base<T>() { } //have to construct the proper instanciation of Base

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