Классы. Часть 2 (Наследование и полиморфизм)


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


Наследование -возможность использования уже введенных объектов для создания других объектов. Каждый из потомков наследует определение данных и методов своего “родителя”- базового класса.

Общий вид определения класса-потомка:
Class Имя_потомка : ключ_доступа Имя_базового_ класса
{
    Дополнительные поля данных;
    Дополнительные методы;
};
Пример определения наследника:

В классе-потомке Stud определяются дополнительные данные:
  •  члены класса массивы grupp и ozenki; 
  •  конструктор и дополнительная член-функция SrBall, 
  • переопределяется функция Show. 
 После этого можно описать члены-функции класса-родителя и класса-наследника:


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





 
Работа с объектами-переменными классов
 

 В функции main созданы один объект-родитель (переменная а) и один объект-наследник (переменная с):



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

Вопрос №5-6 КР


  • Какой класс из описанных является родителем? Наследником? Какими членами-данными обладает класс Stud? 
  • Что означает запись Chel(Fam0,GR,p) в конструкторе класса Stud? Зачем она сделана?


5. Полиморфизм


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


Полиморфизм может быть:

статическим (какой именно метод будет использоваться определяется на этапе компиляции); -правильно работает для потомков в случае определения объектов -статических переменных

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

Здесь описан указатель на базовый класс (ptr) но с его помощью можно работать и с потомками (это удобно при передаче в другие функции).


Однако, по форме вывода на экран видно, что и для наследника  вызываются методы родительского класса:



Вопрос №7 КР
 В чем выражается ошибка системы при выполнении фрагмента программы?


Для правильного выполнения в этом случае методы нужно объявить виртуальными:



 

Комментариев нет:

Отправить комментарий