C ++ Использование абстрактных классов в шаблонных классах

Предположим, у меня есть шаблон класса, такой как:

template <class type, size>
class myTemplate

и у меня был абстрактный базовый класс:

class myDataType

и различные производные классы

class subDataType1 : public myDataType
class subDataType2 : public myDataType
...
class subDataTypeN : public myDataType

Что я хочу сделать, это позвонить:

 myTemplate<myDataType, size> myObject;

Однако это, очевидно, не работает, потому что внутри шаблона я бы создавал объект абстрактного класса. По сути, я хочу, чтобы шаблон работал с любым из моих производных классов, но я не знаю, как это механизировать (например, из Java, где «решения» или обходные пути, такие как подстановочные знаки типа и «Объект», например, могли бы позволить мне, по крайней мере, пройти проверки компилятора).

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

Я должен отметить, что я знаю, что решение этого, вероятно, включает вызов, такой как:

 myTemplate<myDataType*, size> myObject

Но мне, вероятно, понадобится больше подробностей, поскольку я новичок в C ++ (я не знаю, чего не знаю).

0

Решение

Исходя из Java, вы должны понимать, что шаблоны в C ++ не похожи на дженерики в Java, точнее, шаблоны являются дженериками во время компиляции.

Все, что имеет отношение к шаблону или является шаблоном, существует только во время компиляции, когда вы делаете что-то вроде myTemplate<myDataType, size> myObject; на самом деле происходят две вещи:

1. Во время компиляции, когда myDataType а также size подставляются в шаблон, который, в свою очередь, создается для создания типа. Имя этого типа myTemplate<myDataType*, size> и это единственный тип, с которым вы работаете во время выполнения.

2. Во время выполнения создается созданный тип (myTemplate) для создания объекта этого типа.

Из этого можно отметить, что шаблон, созданный с различными аргументами шаблона, будет создавать совершенно разные типы, доступные во время выполнения, которые не будут иметь никаких отношений между ними, отношения существуют только во время компиляции.
Это отличается от того, как обобщенные методы работают в Java, где обобщенный аргумент приводится к Object во время компиляции, а затем во время выполнения приводится к фактическому типу.

Надеюсь, что это помогло пролить свет на шаблоны C ++.

0

Другие решения

Я не совсем понимаю, о чем вы спрашиваете, но если вам нужно быстро обойтись, вместо того, чтобы создавать класс как абстрактный, одна из классных функций в c ++ — виртуальная или чисто виртуальная. Если вы оставите свои функции как виртуальные, вам нужно будет предоставить определение для функции. если вы сделаете их чисто виртуальными, вам придется определять их в унаследованных классах.

Вот как это выглядит:

template <class type, size>
class myTemplate
{
public:
virtual void foo();
myTemplate(){};

};

void myTemplate::foo()
{
}

Это позволяет перезаписывать функцию foo наследуемыми классами, не вызывая ошибок компилятора для неопределенных абстрактных классов.

0

По вопросам рекламы [email protected]