Вход на сайт
как правильно программировать?
785 просмотров
Перейти к просмотру всей ветки
в ответ pkrasnop 20.09.09 22:09, Последний раз изменено 21.09.09 06:04 (anly)
В ответ на:
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
template <typename Point>
class Transform
{
virtual void transform(Point& out, const Point& in) const = 0;
}
В ответ на:
template <typename Derivate, typename Point>
class Transform
{
void transform(Point& out, const Point& in) const { return Derivate::transform(out, in); }
}
а ведь задача в первом случае поставлена некорректно. Некорректо тем что сразу предлагается абстрактый базовый класс. Т.е. предполагается что пользователь этого класса(функция или класс которые будут с ним работать) будет работать именно с базовым классом, не зная о реальном классе(наследнике). Однако второй вариант не удовлетворяет этому требованию, т.к. здесь уже работа с конкретным классом образованным аргументами шаблона. Уже нельзя например передать пользователю массив указателей на базовый класс (где смесь указателей на разные наследники, у каждого из которых своя функцию трансформ).template <typename Derivate, typename Point>
class Transform
{
void transform(Point& out, const Point& in) const { return Derivate::transform(out, in); }
}
Шаблоны второго типа я использовал в своей практике. А вот шаблоны с виртуальным функциями - не помню. Даже наоборот, чтобы избавиться от виртуальности класса я делал его(или его пользователя) шаблонным. Т.е. эти два приёма (в моей практике)исключают друг друга: либо шаблонность, либо виртуальность.
Проклят нарушающий межи ближнего своего (Втор.27:17)