- •Глава 6 посвящена понятию производных классов, которое позволяет строить
- •Раздел 3.4 главы 2. Для обозначения справочного руководства применяется
- •1991 Г.Г. (такие как множественное наследование, статические функции-члены
- •1.1 Введение
- •1.2 Парадигмы программирования
- •1.2.1 Процедурное программирование
- •1.2.5 Объектно-ориентированное программирование
- •1.5 Поддержка объектно-ориентированного программирования
- •1.5.1 Механизм вызова
- •1.5.2 Проверка типа
- •1.5.3 Множественное наследование
- •1.6 Пределы совершенства
- •2.2 Имена
- •2.3.2 Неявное преобразование типа
- •2.4 Литералы
- •2.4.4 Строки
- •2.6. Экономия памяти
- •2.6.1 Поля
- •3.1.1 Анализатор
- •3.1.2 Функция ввода
- •3.2 Сводка операций
- •3.2.3 Инкремент и декремент
- •3.2.5 Преобразование типа
- •3.2.6 Свободная память
- •3.3.2 Оператор goto
- •4.1 Введение
- •4.3.1 Единственный заголовочный файл
- •4.3.2 Множественные заголовочные файлы
- •4.4 Связывание с программами на других языках
- •4.6.3 Передача параметров
- •5.1 Введение и краткий обзор
- •5.3.1 Альтернативные реализации
- •5.3.2 Законченный пример класса
- •Vector и matrix, мы могли бы обойтись без контроля индекса при
- •5.4.5 Указатели на члены
- •5.4.6 Структуры и объединения
- •5.5.3 Свободная память
- •5.5.5 Массивы объектов класса
- •6.1 Введение и краткий обзор
- •6.2.3 Иерархия классов
- •6.2.4 Поля типа
- •6.4.1 Монитор экрана
- •6.5 Множественное наследование
- •7.1 Введение
- •7.3 Пользовательские операции преобразования типа
- •7.3.2 Операции преобразования
- •7.3.3 Неоднозначности
- •7.5 Большие объекты
- •Void f2(t a) // вариант с контролем
- •Void f3(t a) // вариант с контролем
- •Inv() обращает саму матрицу m, а не возвращает новую, обратную m,
- •7.13 Предостережения
- •8.1 Введение
- •8.4.4 Неявная передача операций
- •8.4.5 Введение операций с помощью параметров шаблонного класса
- •8.7.1 Задание реализации с помощью параметров шаблона
- •9.1 Обработка ошибок
- •9.1.2 Другие точки зрения на особые ситуации
- •9.3.2 Производные особые ситуации
- •9.4.2 Предостережения
- •9.4.3 Исчерпание ресурса
- •9.4.4 Особые ситуации и конструкторы
- •9.5 Особые ситуации могут не быть ошибками
- •10.1 Введение
- •10.2 Вывод
- •10.2.1 Вывод встроенных типов
- •10.4.1.2 Поля вывода
- •10.4.1.4 Вывод целых
- •Istream - шаблон типа smanip, а smanip - двойник для ioss.
- •10.5.1 Закрытие потоков
- •10.5.2 Строковые потоки
- •X Целый параметр выдается в шестнадцатеричной записи;
- •11.1 Введение
- •11.2 Цели и средства
- •11.3 Процесс развития
- •11.3.1 Цикл развития
- •11.3.2 Цели проектирования
- •11.3.3 Шаги проектирования
- •11.3.3.1 Шаг 1: определение классов
- •11.3.3.2 Шаг 2: определение набора операций
- •11.3.3.3 Шаг 3: указание зависимостей
- •11.3.3.4 Шаг 4: определение интерфейсов
- •11.3.3.5 Перестройка иерархии классов
- •11.3.3.6 Использование моделей
- •11.3.4 Эксперимент и анализ
- •11.3.5 Тестирование
- •11.3.6 Сопровождение
- •11.3.7 Эффективность
- •11.4 Управление проектом
- •11.4.1 Повторное использование
- •11.4.2 Размер
- •11.4.3 Человеческий фактор
- •11.5 Свод правил
- •11.6 Список литературы с комментариями
- •12.1 Проектирование и язык программирования.
- •12.1.1 Игнорирование классов
- •12.1.2 Игнорирование наследования
- •12.1.3 Игнорирование статического контроля типов
- •12.1.4 Гибридный проект
- •12.2 Классы
- •12.2.1 Что представляют классы?
- •12.2.2 Иерархии классов
- •12.2.3 Зависимости в рамках иерархии классов.
- •Vertical_scrollbar или с помощью одного типа scrollbar, который
- •12.2.6 Отношения использования
- •12.2.7 Отношения внутри класса
- •12.3 Компоненты
- •12.4 Интерфейсы и реализации
- •12.5 Свод правил
- •13.1 Введение
- •13.2 Конкретные типы
- •13.4 Узловые классы
- •1, 2, 6 И 7. Класс, который не удовлетворяет условию 6, походит
- •13.5.1 Информация о типе
- •13.6 Обширный интерфейс
- •13.7 Каркас области приложения
- •13.8 Интерфейсные классы
- •13.10 Управление памятью
12.1.4 Гибридный проект
Переход на новые методы работы может быть мучителен для любой
организации. Раскол внутри нее и расхождения между сотрудниками могут
быть значительными. Но резкий решительный переход, способный в одночасье
превратить эффективных и квалифицированных сторонников "старой школы"
в неэффективных новичков "новой школы" обычно неприемлем. В то же
время, нельзя достичь больших высот без изменений, а
значительные изменения обычно связаны с риском.
Язык С++ создавался с целью сократить такой риск за счет
постепенного введения новых методов. Хотя очевидно, что наибольшие
преимущества при использовании С++ достигаются за счет абстракции
данных, объектно-ориентированного программирования и
объектно-ориентированного проектирования, совершенно неочевидно,
что быстрее всего достичь этого можно решительным
разрывом с прошлым. Вряд ли такой явный разрыв будет возможен,
обычно стремление к усовершенствованиям сдерживается или должно
сдерживаться, чтобы переход к ним был управляемым. Нужно учитывать
следующее:
- Разработчикам и программистам требуется время для овладения
новыми методами.
- Новые программы должны взаимодействовать со старыми программами.
- Старые программы нужно сопровождать (часто бесконечно).
- Работа по текущим проектам и программам должна быть
выполнена в срок.
- Средства, рассчитанные на новые методы, нужно адаптировать к
локальному окружению.
Здесь рассматриваются как раз ситуации, связанные с перечисленными
требованиями. Легко недооценить два первых требования.
Поскольку в С++ возможны несколько схем программирования,
язык допускает постепенный переход на него, используя
следующие преимущества такого перехода:
- Изучая С++, программисты могут продолжать работать.
- В окружении, бедном на программные средства, использование С++
может принести значительные выгоды.
- Программы, написанные на С++, могут хорошо взаимодействовать
с программами, написанными на С или других традиционных языках.
- Язык имеет большое подмножество, совместимое с С.
Идея заключается в постепенном переходе программиста с
традиционного языка на С++: вначале он программирует на С++
в традиционном процедурном стиле, затем с помощью методов абстракции
данных, и наконец, когда овладеет языком и связанными с ним средствами,
полностью переходит на объектно-ориентированное программирование.
Заметим, что хорошо спроектированную библиотеку использовать намного
проще, чем проектировать и реализовывать, поэтому даже с первых своих
шагов новичок может получить преимущества, используя более
развитые средства С++.
Идея постепенного, пошагового овладения С++, а также возможность
смешивать программы на С++ с программами, написанными на языках,
не имеющих средств абстракции данных и объектно-ориентированного
программирования, естественно приводит к проекту, имеющему
гибридный стиль. Большинство интерфейсов можно пока оставить
на процедурном уровне, поскольку что-либо более сложное не
принесет немедленного выигрыша. Например, обращение к стандартной
библиотеке math из С определяется на С++ так:
extern "C" {
#include <math.h>
}
и стандартные математические функции из библиотеки можно использовать
так же, как и в С. Для всех основных библиотек такое включение
должно быть сделано теми, кто поставляет библиотеки, так что
программист на С++ даже не будет знать, на каком языке реализована
библиотечная функция. Использование библиотек, написанных на таких
языках как С, является первым и вначале самым важным способом
повторного использования на С++.
На следующем шаге, когда станут необходимы более сложные
приемы, средства, реализованные на таких языках как С или Фортран,
представляются в виде классов за счет инкапсуляции структур данных
и функций в интерфейс классов С++. Простым примером
введения более высокого семантического уровня за счет перехода
от уровня процедур плюс структур данных к уровню абстракции данных
может служить класс строк из $$7.6. Здесь за счет инкапсуляции
символьных строк и стандартных строковых функций С
получается новый строковый тип, который гораздо проще использовать.
Подобным образом можно включить в иерархию классов любой
встроенный или отдельно определенный тип. Например, тип int
можно включить в иерархию классов так:
class Int : public My_object {
int i;
public:
// definition of operations
// see exercises [8]-[11] in section 7.14 for ideas
// определения операций получаются в упражнениях [8]-[11]
// за идеями обратитесь к разделу 7.14
};
Так следует делать, если действительно есть потребность
включить такие типы в иерархию.
Обратно, классы С++ можно представить в программе на С или
Фортране как функции и структуры данных. Например:
class myclass {
// representation
public:
void f();
T1 g(T2);
// ...
};
extern "C" { // map myclass into C callable functions:
void myclass_f(myclass* p) { p->f(); }
T1 myclass_g(myclass* p, T2 a) { return p->g(a); }
// ...
};
В С-программе следует определить эти функции в заголовочном файле
следующим образом:
// in C header file
extern void myclass_f(struct myclass*);
extern T1 myclass_g(struct myclass*, T2);
Такой подход позволяет разработчику на С++, если у него уже есть
запас программ, написанных на языках, в которых отсутствуют понятия
абстракции данных и иерархии классов, постепенно приобщаться к этим
понятиям, даже при том требовании, что окончательную версии программы
можно будет вызывать из традиционных процедурных языков.
