Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / LECS17.DOC
Скачиваний:
44
Добавлен:
16.04.2013
Размер:
151.55 Кб
Скачать

Порядок выполнения конструкторов

  1. Инициализуются (в порядке объявления) базовые классы.

  2. Инициализуются (в порядке объявления) члены.

  3. Выполняется тело конструктора.

Виртуальные базовые классы создается до того, как создан любой из производных классов, и до того, как созданы невиртуальные базовые классы. Порядок их создания зависит от соответствующего графа. Это порядок «из глубины, слева направо». Деструкторы вызываются в порядке, обратном выполнению конструкторов. Несмотря на свою сложность, эти правила вполне интуитивны.

На многих системах файл iostream.h содержит конкретный, проработанный пример множественного наследования. Он включает класс iostream, который может быть произведен от istream и ostream. Однако, по поводу множественного наследования интересно заметить, что более свежие реализации вернулись к схеме одиночного наследования.

Наследование и проектирование

С одной стороны, наследование – это техника совместного использования кода. С другой стороны, оно отражает представления о решаемой задаче. Наследование выражает взаимосвязи между частями, на которые моно разбить моделируемую проблему. Открытое наследование большей части является выражением отношения ISA (быть экземпляром) между базовыми и производными классами. Прямоугольник – это фигура. Такая концепция позволяет сделать фигуру суперклассом и перенести поведение, описываемое его открытыми функциями-членами, на другие объекты внутри иерархии типа. Другими словами, подклассы, полученные из этого суперкласса, используют общий с ним интерфейс.

Невозможно предложить во всех отношениях оптимальный проект. Проект – это всегда «торг» между различными целями. Которые мы хотим достичь. Например, обобщенность часто противоречит эффективности. Применение иерархии классов, которая выражает ISA-отношения, помогает понять, как разделить код на разумные, логически самостоятельные части, но потенциально привносит неэффективность когда за счет наличия «прослойки» для доступа к (скрытому) состоянию объекта. И все-таки, разумная ISA-декомпозиция может упростить весь процесс программирования. Например, пакету для рисования фигур не нужно «ожидать» будущих дополнительных фигур, которые планируется подключить к системе позднее. Посредством наследования разработчик класса импортирует интерфейс базового класса «фигура» и предоставляет код, реализующий такие операции, как «рисовать». То, что является примитивным или остается общим свойством, не изменяется. Остается неизменным также и то, как клиент использует данный пакет.

Чрезмерное увлечение разбиением на простые составляющие само по себе привносит дополнительную сложность и является игрой в свои ворота. Некоторые решения о разбиении предусматривают существование весьма специализированных классов, которые на самом деле не дают особых преимуществ, и их лучше объединять в более крупные сущности.

Одиночное наследование соответствует иерархической декомпозиции ключевых объектов в рассматриваемой области. Множественное наследование более хлопотно в качестве подхода к моделированию и решению проблемы. При множественном наследовании мы говорим, что новый объект составлен из нескольких уже существующих объектов и обычно рассматриваем его как форму каждого их них. Для того. Чтобы обозначить класс, полученный с помощью множественного наследования, когда все базовые классы ортогональны (независимы), используется термин смесь. В большинстве подобных случаев существует альтернативная формулировка HASA. Например, есть класс для летучих мышей (млекопитающих, которые могут летать); есть класс для чего угодно летающего (что угодно может оказаться млекопитающим); таким образом, летучая мышь – и нечто летающее, и млекопитающее. В зависимости от того, какой код доступен, разработка надлежащего класса для летучей мыши может подразумевать множественное наследование или одиночное наследование с соответствующими HASA-членами.

Множественное наследование представляет проблему для теоретика типов.

Студент может быть произведен от человека. И работник может быть произведен от человека. А как быть с работающим студентом? Вообще говоря, типы лучше понимаются будучи цепочками одиночного наследования.

Ничто из вышесказанного не уменьшает привлекательность множественного наследования как техники повторного пользования кода. Несомненно, оно является мощным обобщением одиночного наследования и, как таковое, вероятно вписывается в стиль работы некоторых программистов. Также как ряд программистов отдает предпочтение интерации (а не рекурсии), многие предпочитаю одиночное наследование и агрегирование множественному наследованию и композиции.

Соседние файлы в папке Лекции