Справочник от Автор24
Поделись лекцией за скидку на Автор24

Принципы объектно-ориентированного программирования

  • 👀 411 просмотров
  • 📌 341 загрузка
Выбери формат для чтения
Статья: Принципы объектно-ориентированного программирования
Найди решение своей задачи среди 1 000 000 ответов
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Принципы объектно-ориентированного программирования» pdf
Лекция №2. Принципы объектно-ориентированного программирования Содержание: инкапсуляция, наследование; полиморфизм; виртуальные методы: понятие о раннем и позднем связывании; примеры. 1. ПРИНЦИП ИНКАПСУЛЯЦИИ Инкапсуляция – такое объединение внутри класса полей и методов, при котором доступ к полю возможен только путем вызова соответствующего метода. При идеальном выполнении принципа инкапсуляции поля класса могут быть только личными (private). Ниже перечислены уровни инкапсуляции, т. е. уровни доступа к элементам класса, два из которых (private и public) мы уже рассмотрели:  private (личный). Этот уровень накладывает самые жесткие ограничения на доступ к элементам класса. Именно, эти элементы могут быть использованы только методами данного класса. Как правило, поля класса объявляются private.  public (общий). Элементы класса данного уровня доступны из любой точки программы (самый «широкий» доступ).  protected (защищенный). Элементы класса данного класса доступны методам данного класса и его наследников (определение класса-наследника см. в п. 2). 2. ПРИНЦИП НАСЛЕДОВАНИЯ Наследование – это возможность определения для базового класса (предка) иерархии производных классов (наследников), в каждом из которых доступны элементы базового класса (их описание становится частью описания производного класса). Иначе говоря, наследование – механизм, посредством которого класс может наследовать элементы другого класса и добавлять к ним свои элементы. Как правило, базовый класс является общим, производные – более специальными, конкретными. Естественно, у класса-наследника обычно больше полей и методов, чем у класса-предка, так как при наследовании обычно добавляются новые элементы. Класс предок и совокупность его наследников всех уровней образуют иерархическое дерево классов. Примеры иерархии классов приведены на рис. 1, 2. Класс студент Класс студент технического вуза Класс студент МЭИ Класс студент ГПИ Класс студент гуманитарного вуза … … Класс студент медицинского вуза … Класс студент АВТИ … Рис. 1. Пример иерархического дерева классов-наследников … Если имеется иерархия классов, то можно рассматривать защищенные (protected) элементы класса, которые доступны для методов своего класса и его наследников. Наследование может быть единичным (наследник имеет одного предка) и множественным (количество предков больше 1). В Си++ допустимо множественное наследование. Наследование может быть общим, личным и защищенным. Видимость полей и функций базового класса из производного определяется секцией, в которой находится объявление компонента, и видом наследования (см. табл. 1): 2 Таблица 1. Видимость компонентов базового класса в производном Вид наследования Объявление компоненВидимость компонентов тов в базовом классе в производном классе private не доступны private protected private public private private не доступны protected protected protected public protected private не доступны public protected protected public public Как видно из таблицы 1, при общем наследовании общие и защищенные элементы класса-предка сохраняют свой уровень инкапсуляции и в классе-наследнике. При личном наследовании общие и защищенные элементы класса-предка становятся личными для класса-наследника. При защищенном наследовании защищенные элементы сохраняют свой уровень в классенаследнике, а общие становятся защищенными. Обратите внимание, что, независимо от вида наследования, личные элементы базового класса не доступны в производных классах. Таким образом, чтобы «достать» их из производного класса, надо использовать унаследованные общие и защищенные методы класса-предка. Описание производного класса в общем виде: class Имя_производного_класса: Вид_наследования_1 Имя_базового_класса_1, Вид_наследования_2 Имя_базового_класса_2, ... Вид_наследования_n Имя_базового_класса_n, { Описание_добавляемых_элементов_производного_класса }; Если Вид_наследования не указан, то по правилу умолчания принимается public. 3 Самая простая ситуация — это единичное общее наследование. Заголовок производного класса в этом случае имеет вид: class имя_наследника: public имя предка;//можно без public Ограничение доступа к элементам класса при наследовании имеет смысл. Так как личные элементы класса-предка не доступны в классенаследнике, то нет проблем в том случае, когда два класса-предка имеют личные элементы (чаще всего поля) с одинаковыми именами. Проблемы с одинаковыми именами защищенных и общих элементов классов-предков также разрешаются ограничением доступа при наследовании. Заметим, что в Объектном Паскале эти проблемы отсутствуют, так как допустимо только единичное наследование. Также следует отметить, что повторное объявление (т. е. переопределение) в классе-наследнике полей класса-предка недопустимо! Повторное использование имен методов (т. е. переопределение методов) разрешено. Пример 1. Модифицирована программа примера лекции 1. Объявлен класс-наследник matr_nasl класса matr. В классе-наследнике добавлены методы calc_max, вычисляющий максимальные значения строк матрицы, и vivod_max, выводящий эти значения. Также в классе-наследнике переопределен метод vivod для вывода минимальных значений строк матрицы (изменена поясняющая фраза, предваряющая вывод). Обратите внимание на следующие моменты: 1. Поля класса-предка объявлены с уровнем доступа protected (а не private, как в лекции1), чтобы эти поля были доступны в классе-наследнике. 2. В С++ конструкторы и деструкторы базового класса в производных классах не наследуются. Однако если базовый класс содержит хотя бы один конструктор и деструктор, то производный класс также должен иметь конструктор и деструктор. При создании объектов производного класса предусмотрен автоматический вызов конструктора базового класса для инициализации его полей, но по умолчанию осуществляется вызов конструктора базового класса без параметров (такой конструктор должен быть запрограммирован). Для инициализации полей базового класса необходимо вызвать конструктор базового класса в списке инициализации конструктора производного класса, передав ему соответствующие аргументы, как показано ниже в коде программы: matr_nasl::matr_nasl(int n1, int m1, char c1):matr(n1, m1, c1){} 4 В пустых фигурных скобках могут присутствовать операторы конструктора производного класса, как, например, показано в примерах 2 и 3. 3. Деструкторы (описанные в программе или созданные автоматически) будут вызываться в порядке, обратном порядку вызова конструкторов. Деструктор класса-наследника, содержащий вывод фразы ends! , сделан для того, чтобы можно было отследить порядок работы деструкторов. Ниже приведен код приложения: #include #include #include using namespace std; class matr {protected: float **a; int n,m; char c; float *min_str; public: matr(int n1, int m1,char c1); ~matr(); void calc_min(); void vvod(); void vivod(); }; matr::matr(int n1, int m1, char c1) {n=n1; m=m1; c=c1; a=new float* [n]; int i,j; for (i=0;i>a[i][j]; } void matr::vivod() {int i; cout<<"Minimums for matrix "<a[i][j]) min_str[i]=a[i][j]; } }; //_________________________________________________ class matr_nasl: public matr 6 {private: float *max_str; public: matr_nasl(int n1, int m1, char c1); ~matr_nasl(); void calc_max(); void vivod_max(); void vivod(); }; matr_nasl::matr_nasl(int n1, int m1, char c1):matr(n1, m1, c1){} //Выше показано, как в конструкторе класса-наследника можно //вызвать конструктор класса-предка matr_nasl::~matr_nasl() { cout<<"ends!"<vvod(); b->vvod(); c->vvod(); a->calc_min(); b->calc_min(); c->calc_min(); a->vivod(); b->vivod(); c->vivod(); a->calc_max(); b->calc_max(); a->vivod_max(); b->vivod_max(); a->~matr_nasl(); b->~matr_nasl(); c->~matr(); _getch(); } 8
«Принципы объектно-ориентированного программирования» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot