- •Управляющие структуры
- •Массивы
- •Рекурсия. Макросы. Уловная компиляция
- •Операторы для работы с указателями
- •Присваивание указателей
- •Объектно-ориентированные модели. Составные части объектного подхода
- •Форматирование ввод/вывод
- •Использование манипулятора
- •Конструкторы и деструкторы
- •Множественное наследование
- •Полиморфизм, реализация полиморфизма через наследование
- •Перегрузка бинарных операторов
Множественное наследование
Имеется два способа организации множественного наследования
Косвенный- производный класс может использоваться в качестве базового для другого производного класса, создавая многоуровневую иерархию
Прямой- производный класс может наследовать более одного базового класса непосредственно прямым способом
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];
}
Абстрактные классы
Перегрузка операторов
Перегрузка операторов напоминает перегрузку функций, однако при этом вводятся необходимые правила:
Оператор всегда перегружается относительно определённого пользователем типа данных такого как класс
Когда оператор перегружается, то ничего из его исходного значения не теряется он приобретает дополнительное значение, связанное с классом, в котором осуществляется перегрузка
Для перегрузки создается оператор функции
Основная цель перегрузки- обеспечить такие же краткие выражения для типов, определённых пользователем, какие С++ обеспечивает для встроенных типов
Для перегрузки должен быть определён оператор
Возвр_тип имя_класса:: operator#(список аргум)
{
//операции;
}
Ограничения на перегрузку:
Нельзя менять приоритет операции
Нельзя менять число операндов оператора
Перегружаемый оператор является членом своего класса и может участвовать в выражениях с объектами только данного класса
При реализации перегрузки нельзя создавать новые операторы
Нельзя перегрузить оператор . : .* ?
Оператор функции за исключением оператора = наследуется производным классом но при этом в производном классе данные операторы можно перегрузить, назначив соответствующие действия