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

28. Виртуальная функция. Объявление виртуальной функции?

Виртуальная функция – это функция, объявленная с ключевым словомvirtualв базовом классе и переопределенная в одном или нескольких производных классах.

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

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

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

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

В общем случае, когда класс не переопределяет виртуальную функцию, используется первое из определений, найденное компилятором по направлению от потомков к предкам.

29. Чисто виртуальная функция. Общая форма чисто виртуальной функции?

Чисто виртуальная функция – это функция, которая объявляется в базовом классе, но не имеет в нем определения (то есть тела), причем любой производный класс имеет свою собственную версию определения этой функции.

Общая форма объявления чисто виртуальной функции:

virtual тип_возвращаемого_значенияимя_функции(список параметров)= 0;

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

30. Понятие "абстрактный класс".

Класс называется абстрактным, если он имеет хотя бы одну чисто виртуальную функцию.

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

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

31. Что такое полиморфизм? в каких формах он может существовать?

Полиморфизм – это способность объектов в одной цепочке иметь одно имя и разные реализации.

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

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

Таким образом, термины "полиморфизм" и "объектно-ориентированное программирование" могут рассматриваться в некотором роде как синонимы.

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

32. Понятие "перегрузка"?

Перегрузкой(или полиморфизмом ad hoc) называется такая ситуация, когда имеется множество различных функций (тел кода) с одним именем.

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

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

#include <iostream.h>

#include <conio.h>

int sqr_it(int i); // объявление функции sqr_it() для значений типа int

double sqr_it(double d); // объявление функции sqr_it() для значений типа double

long sqr_it(long l); // объявление функции sqr_it() для значений типа long

int main()

{

clrscr();

cout<<sqr_it(10)<<"\n";

cout<<sqr_it(11.0)<<"\n";

cout<<sqr_it(9L)<<"\n";

return 0;

}

int sqr_it(int i)

{

cout<<"Вызов функции sqr_it() для аргумента типа int: ";

return i*i;

}

double sqr_it(double d)

{

cout<<"\nВызов функции sqr_it() для аргумента типа double: ";

return d*d;

}

long sqr_it(long l)

{

cout<<"\nВызоы функции sqr_it() для аргумента типа long: ";

return l*l;

}