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

24. Наследование.

Наследование – это механизм получения нового класса из существующего, т.е. способность одного класса перенимать возможности другого класса.

Концепции предметной области(постановка задачи) находятся в различных взаимоотношениях. Одно из таких взаимоотношений – отношение наследования(родитель – потомок).

Пример. Пусть класс Triangle описывает треугольник, а класс Tetragon – четырёхугольник, было бы логичным создать класс Polygon – описывает многоугольники, описывает элементы общих для классов Triangle и Tetragon. А последние 2 кл объявить наследниками базового кл.

class Polygon

{… }; Class Triangle: public Polygon

{public:………Show(); };

Class Tetragon : public Polygon

{public:…….Show(); };

В этом примере производные классы Triangle и Tetragon наследуют все элементы базового класса Polygon. Т.о. Triangle и Tetragon является потомками (обратное не верно). Но каждый из них имеет свой собственный метод Show().

Для базовых классов возможно использование protected(защищённая). Его смысл заключается в том, что элементы этой части класса являются доступными для любого производного класса, но в тоже время они недоступны из вне кл данной иерархии.

25. Множественное наследование. Неоднозначности множ наслед-я.

Множественное наследование – это такое наследование, при котором класс м.б. наследником более одного базового класса.

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

Рассмотрим пример реализации класса Divan, - Krovat (SleeperSofa)

class Bed {public: Bed() {} Void sleep (){}int weight; }; class Sofa { public: Sofa () { …….. }

void watchTV () {……..} int weight; };class SleeperSofa: public Bed, public Sofa {public: SleeperSofa () {…..}

void FoldOut (){…..} int main (){ SleepSofa ss;

ss.watchTV (); // sofa:: watchTV ()

ss.FoldOut (); // SleeperSofa:: FoldOut ()

ss.Sleep (); // Bed::Sleep ()

Неоднозначности множ-го наследования

1)Конфликт имён. Если рассмотреть предыдущий пример, то можно заметить, что классы Bed и Sofa содержат один Weight(вес). Встаёт вопрос, какой именно член Weight наследует класс Sleeper Sofa. Ответ: оба.

2)Виртуальное наследование. Существует неоднозначность, устранить которую несколько сложнее. Предпол, что от базового кл А, имеющего некоторый эл х, наследуется оба кл В и С, а класс D явл производным от этих двух классов.Если попытаться обратится к элементу х из методов класса D, то компилятор воспринимает значение D::x как неоднозначность и прекратит работы.

26. Полиморфизм. Перегрузка ф-ции.

Виды полиморфизма:перегр ф-ци, перегр операторов, виртуальные ф-ции.

С++ позволяет называть несколько разных ф-ций одним и тем же именем. Различают т.н. полное имя ф-ции. В него входят: собственно имя ф-ци, аргументы ф-ции (и их число), имя класса, кот принадлежит ф-ция, тип аргументов ф-ции (текст результата не входит в полное имя ф-ции).

След. Ф-ции имеют различные полные имя ф-ции, несмотря на то, что собственно их имена совпадают.

Void fn (void);

Void fn (int n);

Void fn (double d);

Void fn (int n1. int n2);

Полное имя ф-ции иногда наз сигнатурой ф-ции. Следующие ф-ции не м.б. использованы в одной программе: int f (int n);

double f (int n);

Поскольку конструктор является ф-цией, то его тоже м перегружать.

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