Шаблоны C ++ и наследование - PullRequest
4 голосов
/ 24 сентября 2010

Могу ли я смешивать наследование и шаблоны таким образом? :

template <class T> 
class AbstractType { // abstract
//....
}

template <class T> 
class Type1 : public AbstractType<T> {
//....
}

И позже я могу использовать эти классы следующим образом:

AbstractType<SomeClass>* var1 = new Type1<SomeClass>();

Спасибо за помощь.

Ответы [ 3 ]

7 голосов
/ 24 сентября 2010

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

6 голосов
/ 24 сентября 2010

Вы можете, но это не будет так полезно, как вы думаете. Вы можете определить структуры следующим образом:

#include <string>
#include <vector>
using namespace std;

template<typename Val>
class Base
{
public:
    virtual Val DoIt() const = 0;
};

template<typename Val>
class Derived : public Base<Val>
{
public:
    Derived(const Val& val) : val_(val) {};
    Val DoIt() const { return val_; }
protected:
    Val val_;
};

int main()
{
    Derived<string> sd("my string");
    string sd_val = sd.DoIt();

    Derived<float> fd(42.0f);
    float fd_val = fd.DoIt();
}

Но когда вы определяете абстрактные базовые типы, вам часто требуется их коллекция и возможность вызывать указатель базового класса, чтобы получить полиморфное поведение. Если вы шаблонизируете базовый класс, вы не сможете этого сделать, потому что каждый вариант параметров шаблона будет создавать свой тип. Base<int> полностью отличается от Base<string>, и вы не можете просто получить Base*, который указывает на любой из них.

Этот код не скомпилируется:

vector<Base*> my_objs;
1 голос
/ 24 сентября 2010

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

например,

template<class T> struct S{
   T mt;
};

Такая структура может быть создана для T = int, T= double, но не T = void.

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