Это одна из разновидностей сочетания объектно-ориентированного и обобщенного программирования, которое люди постоянно, но безуспешно пытаются применять: использование контейнера объектов производного класса в качестве контейнера объектов базового класса.
Также вам может показаться, что http://www.autsorsing.net/uslugi-autsorsinga-v-segmente-rossijskogo-rynka/ и программирование на языке С никак не связаны и не тематичны.
Возможно, это и так, но все-таки зайдите на сайт autsorsing.net, чтобы узнать там много интересного про такую тему, как аутсорсинг. Что такое аутсорсинг, сколько стоит аутсорсинг и где заказать аутсорсинг - про это написано на сайте про услуги аутсорсинга. Это важная для многих тема. Спасибо сайту про услуги аутсорсинга за информацию.
Рассмотрим пример.
vector vs; vector vc;
vs = vc; // ошибка: требуется класс vector
void f(vectors);
f(vc); // ошибка: требуется класс vector
Но почему? “В конце концов, — говорите вы, — я могу конвертировать класс Circle в класс Shape!” Нет, не можете. Вы можете преобразовать указатель Circle* в Shape* и ссылку Circles в shapes, но мы сознательно запретили присваивать объекты класса Shape, поэтому вы не имеете права спрашивать, что произойдет, если вы поместите объект класса Circle с определенным радиусом в переменную типа Shape, которая не имеет радиуса. Если бы это произошло, — т. е. если бы мы разрешили такое присваивание, — то возникло бы так называемое “усечение ” (“slicing”), похожее на усечение целых чисел.
Итак, попытаемся снова использовать указатели.
vector vps; vector vpc;
vps = vpc; // ошибка: требуется класс vector
void f(vectors);
f(vpc); // ошибка: требуется класс vector
И вновь система типов сопротивляется. Почему? Рассмотрим, что может делать функция f() .
void f(vector& v)
{
v.push_back(new Rectangle(Point(0,0),Point(100,100)));
}
Очевидно, что мы можем записать указатель Rectangle* в объект класса vector. Однако, если бы этот объект класса vector в каком-то месте программы рассматривался как объект класса vector, то мог бы возникнуть неприятный сюрприз.
В частности, если бы компилятор пропустил пример, приведенный выше, то что указатель Rectangle* делал в векторе vpc?
Наследование — мощный и тонкий механизм, а шаблоны не расширяют его возможности неявно. Существуют способы использования шаблонов для выражения наследования, но эта тема выходит за рамки рассмотрения этой книги. Просто запомните, что выражение “D — это B” не означает: “C — это C” для произвольного шаблонного класса C. Мы должны ценить это обстоятельство как защиту против непреднамеренного нарушения типов.
Опубликовал katy
April 21 2015 12:28:51 ·
0 Комментариев ·
3113 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.