C ++: Полиморфный шаблон класса

Рассмотрим класс Calendar, в котором хранится множество объектов Date. Календарь предназначен для хранения коллекции объектов любого типа, которые наследуются от Date. Я думал, что лучший способ сделать это, чтобы иметь шаблон класса, такой как

template<typename D> class Calendar{ 
    ...
}

Но меня поразило, что теперь D действительно может быть любым классом. Мой вопрос сейчас, как я могу убедиться, что D является подклассом объекта даты?

Я знаю, как это сделать на Java, но я все еще незнаком с синтаксисом C ++. Проблема очень похожа на то, как некоторые коллекции могут принимать только переменные шаблона, которые реализуют Comparable. Заголовок будет выглядеть примерно так

public class Calendar<D extends Date>{
     ...
}

--------------------РЕДАКТИРОВАТЬ: ---------------------------- --------------

Аргумент шаблона определяет, к какому фактическому дню относится календарь. Различные типы дат относятся к одному и тому же дню в разных форматах. Например, если я сделаюCalendar<Gregorian> он сможет принимать даты в другомDate формат, скажем, юлианский календарь или любой другой формат даты и представить их в григорианском формате. Это позволяет для преобразования между календарями в разных форматах даты. Итак, если у меня естьCalendar<Gregorian> Я могу легко превратить его вCalendar<Julian>, Тогда возможно следующее:

Calendar<Gregorian> cal;
std::cout << "These events are entered as dates in 
    the Gregorian calendar" << std::endl;
cal.add_event("Christmas", 12, 25);
cal.add_event("Gregorian new year", 1, 1);
std::cout << cal << std::endl;
std::cout << "----" << std::endl;
std::cout << "And printed out as Julian dates" << std::endl;
Calendar<Julian>(cal);
std::cout << cal<< std::endl;

и выводы:

These events are entered as dates in the Gregorian calendar
2009-12-25 Christmas
2010-01-01 Gregorian new year
----
And printed out as Julian dates
2009-12-13 Christmas
2009-12-19 Gregorian new year

------------- Новое редактирование: ----------------------

Последнее редактирование теперь имеет больше смысла. У меня было небольшое несогласие с форматированием.

Спасибо за ответы на все вопросы.

Я учусь на информатике на третьем курсе, и я бы сказал, что довольно хорошо знаком с ОО и связанными с ним понятиями, такими как полиморфизм и т. Д. Выразите условие для аргумента шаблона так же, как в Java, и решите проблему кратко, элегантно и интуитивно понятно.

Ответы на вопрос(6)

Ваш ответ на вопрос