Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
81
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

16.4 Множественное наследование

В С++ допускается множественное наследование, когда класс является производным от нескольких базовых классов.

class AB: public A, public B {...};

Класс AB наследует все компоненты классов A и B. Если компоненты базовых классов имеют одинаковые имена, неоднозначность разрешается операцией разрешения видимости:

A::имя или B::имя.

Возможен случай, когда оба класса A и B имеют в числе предков класс R (рисунок а).

R R R

| | / \

A B A B

\ / \ /

AB AB

а) б)

В этом случае класс AB косвенно наследует два разных экземпляра класса R и при обращении к компонентам R из функций AB потребуется уточнить, какой R имеется в виду:

A::имя или B::имя.

Чтобы класс AB наследовал не два, а один экземпляр класса R, его надо объявить виртуальным при определении классов A и B.

class A: virtual public R {...

class B: virtual public R {...

Тогда возникнет ситуация, изображенная на рис.1-б, и уточнение не понадобится.

Вопросы

1. Как можно обратиться к статическому элементу класса?

2. Какие элементы класса доступны из статической функции ?

3. Какие права у друга класса ?

4. Какие операции не допускают перегрузку ?

5. Какие перегруженные операции наследуются ?

6. Может ли перегружаемая операция не быть элементом класса ?

7. Как выглядит заголовок перегружаемой операции постинкремента, прединкремента ?

8. Как разрешается неоднозначность доступа к элементу при множественном наследовании ?

9. Зачем нужны виртуальные классы ?

17 КЛАССЫ ПОТОКОВ В С++

17.1 Библиотека потоков

Библиотека потоков iostream предоставляет набор классов для управления вводом-выводом. Чтобы обеспечить программе доступ к библиотеке потоков, в нее нужно включить заголовочный файл iostream.h.

Также могут понадобиться заголовочные файлы:

fstream.h — файловый ввод-вывод;

iomanip.h — манипуляторы;

strstream.h — резидентные потоки.

Различные функции библиотеки iostream (в том числе и операции ввода/вывода) имеют альтернативный вариант определения inline. Этот вариант выбирается транслятором, если перед включением файла iostream.h определен макрос _BIG_INLINE.

17.2 Предопределенные потоки

Библиотека потоков имеет 4 предопределенных объекта-потока, ассоциированных со стандартным вводом и выводом:

1) cin — ассоциирован с клавиатурой (аналог в С — stdin),

2) cout — ассоциирован с экраном (аналог в С — stdout),

3) cerr — ассоциирован с устройством ошибок (экраном).

Не буферизирован (аналог в С — stderr),

4) clog — то же, но буферизирован (аналога в С нет).

Имена cin и cout можно переназначить вашим собственным объектам-потокам

mystream = cin;

что позволяет легко переадресовывать стандартный ввод или вывод.

17.3 Операции помещения в поток и извлечения из потока

Библиотека потоков С++ предусматривает два основных класса для ввода и вывода: istream и ostream.

Класс ostream использует для вывода переопределенную операцию левого сдвига ( << ), которую называют операцией помещения в поток.

Класс istream использует для ввода переопределенную операцию правого сдвига ( >> ), которую называют операцией извлечения из потока.

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

Операции помещения/извлечения можно легко распространить на пользовательские типы данных. Для этого надо определить две функции со следующими заголовками:

istream& operator >> (istream& is, имя_типа& varName);

ostream& operator << (ostream& os, имя_типа& varName);

Определяя операции помещения/извлечения для классов, их обычно делают дружественными, чтобы обеспечить доступ к частным элементам данных класса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]