Бьерн Страуструп.
Язык программирования С++
218
его до использования. Иначе будет использоваться создаваемый по шаблону класс. Поскольку класс
должен иметь в точности одно определение в программе, использовать и специальный вариант класса,
и вариант, создаваемый по шаблону, будет ошибкой.
Поскольку у нас уже специальный вариант класса Comparator для char*, специальный вариант класса
SortableVector для char* не нужен, и можем, наконец, попробовать сортировку:
void f(SortableVector
& vi,
SortableVector&
vc,
SortableVector&
vi2,
SortableVector&
vs)
{
sort(vi);
sort(vc);
sort(vi2);
sort(vs);
}
Возможно иметь два вида векторов и не очень хорошо, но, по крайней мере, SortableVector является
производным от Vector. Значит если в функции не нужна сортировка, то в ней и не надо знать о классе
SortableVector, а там, где нужно, сработает неявное преобразование ссылки на производный класс в
ссылку на общий базовый класс. Мы ввели производный от Vector и Comparator класс SortableVector
(вместо того, чтобы добавить функции к классу, производному от одного Vector) просто потому, что
класс Comparator уже напрашивался в предыдущим примере. Такой подход типичен при создании
больших библиотек. Класс Comparator естественный кандидат для библиотеки, поскольку в нем можно
указать различные требования к операциям сравнения для разных типов.
Достарыңызбен бөлісу: