Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КПиЯП.docx
Скачиваний:
7
Добавлен:
25.09.2019
Размер:
75.59 Кб
Скачать

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

Имеется два способа организации множественного наследования

Косвенный- производный класс может использоваться в качестве базового для другого производного класса, создавая многоуровневую иерархию

Прямой- производный класс может наследовать более одного базового класса непосредственно прямым способом

Class base

{};

Class bas1f

{ };

Class derived::

{ };

Конструкторы и деструкторы наследование

Если у базового и производного класса имеются конструкторы и деструкторы, то конструкторы выполняются в порядке наследования, а деструкторы в обратном

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

Class base

{ int I;

Public: base (int n)

{ i=n;}

~base ();

Void show

{cout<<I;}

};

Class d::public base

{ int j;

Public:d (int n):base (n)

{ j=n;}

~d()

};

Int main ()

{d.obj (10):obj.showi();}

Полиморфизм, реализация полиморфизма через наследование

Полиморфизм делится на статический и динамический.

Динамический полиморфизм включает наследование и виртуальные функции.

Виртуальная функция- функция-член класса, объявленная в базовом классе и переопределённая в производном.

Что бы создать виртуальную функцию следует указать ключевое слово virtual перед её объявлением в БАЗОВоМ классе

Virtual int a;

Виртуальная функция в базовом классе определяет вид интерфейса(способ вызова этой функции)

Каждое переопределение виртуальной функции реализует операции

При обычном вызове виртуальная функция ничем не отличается от остальных , особые свойства проявляются при вызове указателей. Виртуальные функции являются особыми функциями т.к. при вызове объекта производного класса с помощью указателя на него. С++ определяет во время исполнения программы какую функцию вызвать, основываясь на типе объекта. Для разных объектов вызываются разные версии одной и той же виртуальной функции

Класс, содержащий одну или более виртуальных функция называется полиморфным

Base *p,b;

//указатель на объект базового класса

P=&b;

p->vfunc();

вызов на объект через ссылку

base b;

b.vfunc(); //вызов виртуальной функции через ссылку

демонстрация работы с виртуалньой функцией

#include <iostream>

#include <conio.h>

Class area

{

Public:

Double dm1, dm2;

Virtual void printarea()

{ cout<<”virtual function”;

}

};

Class rectangle : public area

{

Public:

Void printarea()

{

Cout<<”S1=”<<dm1*dm2;

}

};

Class triagle : public area

{ public:

Void printarea()

{

Cout<<”S2=”<<0.5*dm1*dm2;

}

Int main()

{ area a;

Rectangle r;

Triangle t;

a.printarea();

cout<<”\n Vv2 razmer figure:”;

cin>>r.dm1>>r.dm2;

cout<<\n Ploschad pryamoug:”;

r.printarea();

cout<<”\n Vv2 razmer figure:”;

cin>>t.dm1>>t.dm2;

cout<<”\n Ploschad pryamoug:”;

t.printarea();

getch();

return 0;

}

Если функция была объявлена как виртуальная, то она остается таковой вне зависимости от количества уровней иерархии через которые она проходит. Если в производном классе виртуальная функция не переопределяется, тогда используется её версия из базового класса.

Виртуальные функции в С++ позволяют поддерживать полиморфизм времени исполнения. Базовый класс определяет интерфейс , который наследует производные классы, вместе с тем имеет собственные реализации данных. Отделение интерфейса от реализации позволяет создавать в библиотеке классов поставляемые независимыми разработчиками т.к доступ ко всем объектам осуществляется одинаковым способом , даже если реальные действия объектов отличаются при переходе от одного класса к другому.

Создайте класс математика , определите в нём виртуальную функцию , которая выводит на экран значение параметров. В производных классах +/-. Переопределите её с целью реализации сложения и вычитания.

Создайте класс матрица определив в нём виртуальную функцию подсчётов суммы элемен

тов матрицы .Реализуйте два класса с перегруженной функцией, определяющий максимальный и минимальный элемент матрицы.

Статический полиморфизм: перегрузка функций, перегрузка операторов

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

Class absolute_value

{ public:

Int number (int n);

Double number (double n);

};

Int absolute_value:: number( int n)

{ int answer;

Answer= abs(n);

Return (answer);

}

Double absolute_value:: namber (double n)

{ double answer;

Answer =fabs(n);

Return (answer);}

Main ()

{ absolute_value;

Value;

Cout<<value.number ( -15)<<value.number(15, 45);}

Class absolute_value

{ public:

Int sum (int n, int y);

Int sum (int n,int y,int x);

};

Absolute_value::sum

{ int summ;

Sum=n+y;

Return (summ);

Absolute_value::sum

{ int sum;

Sum= (n+y)*x;

Return (sum);}

Содержащий перегруженную функцию, которая в случае передачи одного параметра формирует массив и находит сумму элементов массива, в случае передачи двух параметров формируется матрица и в ней осуществляется поиск максимального и минимального элемента

Class absolute_value

{ public:

Int sum (int m)

Int sum (int m, int n)

};

Absolute_value::sum

{ int sum;

Int mass[m];

Srand(time (0));

For (int i=0;i<m;i++)

{ mass[m]= rand ()% 100;

Sum+=mass[i];

}

Абстрактные классы

Перегрузка операторов

Перегрузка операторов напоминает перегрузку функций, однако при этом вводятся необходимые правила:

  1. Оператор всегда перегружается относительно определённого пользователем типа данных такого как класс

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

  3. Для перегрузки создается оператор функции

Основная цель перегрузки- обеспечить такие же краткие выражения для типов, определённых пользователем, какие С++ обеспечивает для встроенных типов

Для перегрузки должен быть определён оператор

Возвр_тип имя_класса:: operator#(список аргум)

{

//операции;

}

Ограничения на перегрузку:

  1. Нельзя менять приоритет операции

  2. Нельзя менять число операндов оператора

  3. Перегружаемый оператор является членом своего класса и может участвовать в выражениях с объектами только данного класса

  4. При реализации перегрузки нельзя создавать новые операторы

  5. Нельзя перегрузить оператор . : .* ?

Оператор функции за исключением оператора = наследуется производным классом но при этом в производном классе данные операторы можно перегрузить, назначив соответствующие действия