- •Конспект по "Объектно-ориентированному программированию".
- •1. Что такое объект? Понятия "состояние" и "поведение"?
- •2. Понятия "интерфейс" и "реализация"?
- •3. Понятия "класс" и "абстрактный тип данных"?
- •4. Основные категории классов?
- •5. Объявление класса? Общий вид объявления класса? Включение кода метода внутри объявления класса?
- •6. Особенности локальных классов?
- •7. Понятие inline-метода. Способы создания?
- •9. Константный объект? Константный метод?
- •10. Конструктор. Его назначение и синтаксические конструкции вызова конструктора?
- •11. Конструктор копирования. Общий вид и случаи вызова?
- •12. Что называется конструктором по умолчанию? Конструктором преобразования?
- •13. Основные свойства и правила использования конструкторов.
- •14. Деструктор. Вызов деструкторов (автоматический и явный).
- •15. Основные свойства и правила использования деструкторов.
- •16. Создание и уничтожение объектов.
- •17. Что такое наследование?
- •18. Понятия "базовый класс" и "производный класс"?
- •19. Принцип подстановки. Различие между понятиями "подкласс" и "подтип"?
- •20. Основные формы наследования?
- •21. Преимущества наследования?
- •22. Недостатки наследования?
- •23. Общая форма наследования классов? Спецификаторы доступа при наследовании?
- •24. Конструкторы и деструкторы производных классов? Порядок вызова конструкторов и деструкторов при множественном наследовании?
- •25. Множественное наследование. Общая форма?
- •26. Передача параметров в базовый класс. Назначение. Общая форма?
- •27. Указатели и ссылки на производные классы?
- •28. Виртуальная функция. Объявление виртуальной функции?
- •29. Чисто виртуальная функция. Общая форма чисто виртуальной функции?
- •30. Понятие "абстрактный класс".
- •31. Что такое полиморфизм? в каких формах он может существовать?
- •32. Понятие "перегрузка"?
- •33. Приведение типа. Неопределенность. Причины возникновения неопределенности и способы ее устранения?
- •34. Понятие "параметрическая перегрузка"?
- •35. Понятие "переопределение"? в чем заключается различие между перегрузкой и переопределением?
- •36. В чем заключается процесс уточнения?
- •37. Что такое шаблоны (или обобщенные функции)? Их назначение?
- •38. Функция-шаблон. Назначение функции-шаблона? Общий вид функции-шаблона?
- •39. Класс-шаблон. Общая форма класса-шаблона и экземпляра такого класса?
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;
}