Сентябрь 20081 Объектно-ориентированное программирование (5 часов)

Презентация:



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

Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Информационные технологии Стандартные библиотечные функции манипулирование данными преобразование и шифрование определение пользователями функций.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Абстрактные типы данных Май Основные вопросы Определение типа и поколения языков программирования Понятия абстракции и абстрактного типа данных.
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Методология объектно- ориентированного программирования.
©Павловская Т.А. Язык С++ Курс «С++. Программирование на языке высокого уровня» Павловская Т.А.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
OOП Инна Исаева. Подпрограмма – это большая программа, разделённая на меньшие части. В программе одна из подпрограмм является главной. Её задача состоит.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Прикладное программирование кафедра прикладной и компьютерной оптики Наследование.
Конструкторы и Деструкторы Конструкторы - функции, явно предназначенные для инициализации объектов Деструкторы - функция обратная конструктору для обеспечения.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Наследование. Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
В. Дихтяр ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ (для бакалавров) Российский университет дружбы народов Институт гостиничного бизнеса и туризма Раздел 1.Разработка.
Транксрипт:

Сентябрь Объектно-ориентированное программирование (5 часов)

Сентябрь Основные вопросы Основные понятия объектно- ориентированного программирования Основные понятия объектно- ориентированного программирования Объектно-ориентированное программирование на C++ Объектно-ориентированное программирование на C++ Дополнительные средства создания классов в С++ Дополнительные средства создания классов в С++ Множественное наследование Множественное наследование Шаблоны классов Шаблоны классов

Сентябрь Поколения языков Первое поколение - языки с минимальными возможностями типизации Первое поколение - языки с минимальными возможностями типизации Предоставляют лишь средства для описания переменных простых типов и массивов; никаких новых типов вводить нельзя. Предоставляют лишь средства для описания переменных простых типов и массивов; никаких новых типов вводить нельзя. Фортран, Алгол-60. Фортран, Алгол-60. Второе поколение – языки, предоставляющие программисту основные конструкторы типов: массивы, записи, объединения Второе поколение – языки, предоставляющие программисту основные конструкторы типов: массивы, записи, объединения ПЛ/1, Алгол-68, Паскаль, С ПЛ/1, Алгол-68, Паскаль, С Тип рассматривается как множество значений, получаемых из базисных множеств с помощью конструкторов. Тип рассматривается как множество значений, получаемых из базисных множеств с помощью конструкторов. Все операции над типами данных предопределенные определяемые языком, а не программистом. Все операции над типами данных предопределенные определяемые языком, а не программистом. Новые типы могут получать имена, но с ними нельзя связывать новых, специально вводимых операций. Новые типы могут получать имена, но с ними нельзя связывать новых, специально вводимых операций. Третье поколение – языки, предоставляющие программисту средства определения абстрактных типов данных Третье поколение – языки, предоставляющие программисту средства определения абстрактных типов данных С++, C#, Java С++, C#, Java Типы понимаются как множества с операциями. Типы понимаются как множества с операциями.

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

Сентябрь Определение абстрактного типа данных Абстрактный тип данных это способ определения некоторого понятия в виде класса объектов с некоторыми свойствами и операциями. Абстрактный тип данных это способ определения некоторого понятия в виде класса объектов с некоторыми свойствами и операциями. Так как свойства обычно выражаются в терминах операций, то абстрактный тип данных часто отождествляют с соответствующим множеством операций. Так как свойства обычно выражаются в терминах операций, то абстрактный тип данных часто отождествляют с соответствующим множеством операций. Например: Например: определение понятия стека в терминах операций "втолкнуть элемент в стек", "создать новый стек", "выдать верхний элемент" и т.д. определение понятия стека в терминах операций "втолкнуть элемент в стек", "создать новый стек", "выдать верхний элемент" и т.д. В языке программирования такое определение оформляется как специальная синтаксическая конструкция, называемая в разных языках капсулой, модулем, кластером, классом, пакетом, формой и т.д. В языке программирования такое определение оформляется как специальная синтаксическая конструкция, называемая в разных языках капсулой, модулем, кластером, классом, пакетом, формой и т.д. Понятие абстрактного типа данных это, по существу, аналог определения в математике, где новые понятия образуются из некоторых исходных объединением их в одно целое, имеющее новый статус, новое имя. Понятие абстрактного типа данных это, по существу, аналог определения в математике, где новые понятия образуются из некоторых исходных объединением их в одно целое, имеющее новый статус, новое имя.

Сентябрь Объектно-ориентированное программирование Идея абстрактных типов данных является основой объектно-ориентированного программирования (ООП). Идея абстрактных типов данных является основой объектно-ориентированного программирования (ООП). Основные принципы ООП были разработаны еще в языках Simula-67 и Smaltalk, но в то время не получили распространения из-за сложности освоения и низкой эффективности реализации. Основные принципы ООП были разработаны еще в языках Simula-67 и Smaltalk, но в то время не получили распространения из-за сложности освоения и низкой эффективности реализации. В С++ концепции ООП реализованы эффективно и непротиворечиво, что явилось основой успешного распространения как языка, так и концепции ООП. В С++ концепции ООП реализованы эффективно и непротиворечиво, что явилось основой успешного распространения как языка, так и концепции ООП. ООП – не просто набор новых средств, добавленных в язык ООП – не просто набор новых средств, добавленных в язык Например, на С++ можно писать программы и без использования ООП, и наоборот, можно написать объектную по сути программу на языке не содержащим специальных средств поддержки объектов. Например, на С++ можно писать программы и без использования ООП, и наоборот, можно написать объектную по сути программу на языке не содержащим специальных средств поддержки объектов. ООП – новая парадигма программирования ООП – новая парадигма программирования

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

Сентябрь Абстрактные типы данных и ООП Переменные абстрактного типа данных называются «объектами» или «экземплярами» данного типа данных (применительно к С++ «экземплярами класса»). Переменные абстрактного типа данных называются «объектами» или «экземплярами» данного типа данных (применительно к С++ «экземплярами класса»). Объекты взаимодействуют между собой посылая и получая сообщения. Объекты взаимодействуют между собой посылая и получая сообщения. Сообщение – это запрос на выполнения некоторого действия, содержащий необходимые параметры. Сообщение – это запрос на выполнения некоторого действия, содержащий необходимые параметры. Механизм сообщений реализуется с помощью вызова операций, включенных в абстрактный тип данных. Механизм сообщений реализуется с помощью вызова операций, включенных в абстрактный тип данных.

Сентябрь Выбор степени абстракции Выбор степени абстракции определяется типом задачи, которую требуется решить. Выбор степени абстракции определяется типом задачи, которую требуется решить. Не имеет смысла использовать сложные технологии для решения простых задач, но попытка «по-простому» справиться со сложной проблемой обречена на провал. Не имеет смысла использовать сложные технологии для решения простых задач, но попытка «по-простому» справиться со сложной проблемой обречена на провал. Еще одной проблемой является то, что сложные технологии требуют больших затрат времени на освоение. Еще одной проблемой является то, что сложные технологии требуют больших затрат времени на освоение.

Сентябрь Основные свойства ООП Инкапсуляция Инкапсуляция Наследование Наследование Полиморфизм Полиморфизм

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

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

Сентябрь Пример иерархии типов данных Гражданин Военнослужащий Пенсионер МОФСБ Опер АналитикНачальник

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

Сентябрь Пример полиморфизма Гражданин Военнослужащий Пенсионер Сотрудник МОСотрудник ФСБ Опер АналитикНачальник Объявим переменную X типа «Аналитик». Объект X является как экземпляром класса «Аналитик» так и экземпляром классов «Сотрудник ФСБ», «Военнослужащий», «Гражданин»

Сентябрь Наследование и агрегация Агрегация - включение существующих типов данных во вновь создаваемый в качестве составных элементов. Агрегация - включение существующих типов данных во вновь создаваемый в качестве составных элементов. Важно не путать агрегацию и наследование. Важно не путать агрегацию и наследование. Агрегация не создает иерархии и не допускает полиморфизма Агрегация не создает иерархии и не допускает полиморфизма Сотрудник ФСБ Военнослужащий Дата ДЕНЬ - целое МЕСЯЦ - целое ГОД - целое

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

Сентябрь ООП в С++ Абстрактные типы данных в С++ создаются с помощи синтаксической конструкции называемой «классом». Абстрактные типы данных в С++ создаются с помощи синтаксической конструкции называемой «классом». Классы позволяют программисту на С++ воспользоваться всеми свойствами ООП (инкапсуляция, наследование и полиморфизм) Классы позволяют программисту на С++ воспользоваться всеми свойствами ООП (инкапсуляция, наследование и полиморфизм)

Сентябрь Инкапсуляция в С++ Спецификация класса в С++ Спецификация класса в С++ class имя_класса{ модификатор_доступа: [атрибуты] [методы] модификатор_доступа: [атрибуты] [методы] …}; Модификаторы доступа Модификаторы доступа private private public public protected protected

Сентябрь Пример использования класса для реализации понятия даты class date{ private: int month, day, year; public: void set(int, int, int); void get(int*, int*, int*); void next(); void print(); };

Сентябрь Простое наследование в C++ При описании класса в его заголовке указывается класс, являющийся для него базовым. При описании класса в его заголовке указывается класс, являющийся для него базовым. Возможность обращения к элементам этого класса регулируется с помощью ключей доступа private, protected и public Возможность обращения к элементам этого класса регулируется с помощью ключей доступа private, protected и public class имя: [private|protected|public] базовый_класс { тело класса }; По умолчанию для классов используется ключ доступа private По умолчанию для классов используется ключ доступа private Простым называется наследование, при котором производный класс имеет одного родителя. Простым называется наследование, при котором производный класс имеет одного родителя.

Сентябрь Доступ к элементам базового класса Ключ доступа Спецификатор в базовом классе Доступ в производном классе privateprivateprotectedpublicнет privateprivate protectedprivateprotectedpublicнетprotectedprotected publicprivateprotectedpublicнетprotectedpublic

Сентябрь Пример простого наследования class date{ private: int month, day, year; public: void set(int, int, int); void get(int*, int*, int*); void next(); void print(); };… date d; d.day = 15;// Ошибка! d.set(2006,1,1);d.print(); date *pd = new date; pd->set(2006,1,1);pd->print(); delete pd;

Сентябрь class datetime: public date{ private: int hour, min, sec; public: void setAll(int, int, int, int, int, int); void getAll(int*, int*, int*, int*, int*, int*); void setTime(int, int, int); void getTime(int*, int*, int*); void printAll(){ … printf(%i,day);// Ошибка print();// Правильно } void printTime(); };… datetime dt; dt.set(2006,1,1);dt.setAll(2006,1,1,10,30,00);dt.printAll();dt.printTime();dt.print(); datetime *pdt = new datetime; pdt->set(2006,1,1);pdt->setAll(2006,1,1,10,30,00);pdt->printAll();pdt->printTime();pdt->print();

Сентябрь class datetime: private date{ private: int hour, min, sec; public: void setAll(int, int, int, int, int, int); void getAll(int*, int*, int*, int*, int*, int*); void setTime(int, int, int); void getTime(int*, int*, int*); void printAll(); void printTime(); };… datetime dt; dt.set(2006,1,1);// Ошибка!! dt.setAll(2006,1,1,10,30,00);dt.printAll();dt.printTime(); dt.print(); // Ошибка!! datetime *pdt = new datetime; pdt->set(2006,1,1);// Ошибка!! pdt->setAll(2006,1,1,10,30,00);pdt->printAll();pdt->printTime(); pdt->print();// Ошибка!!

Сентябрь Наследование и конструкторы Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы. Порядок вызова конструкторов определяется приведенными ниже правилами. Конструкторы не наследуются, поэтому производный класс должен иметь собственные конструкторы. Порядок вызова конструкторов определяется приведенными ниже правилами. Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса по умолчанию (то есть тот, который можно вызвать без параметров). Если в конструкторе производного класса явный вызов конструктора базового класса отсутствует, автоматически вызывается конструктор базового класса по умолчанию (то есть тот, который можно вызвать без параметров). Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса. Для иерархии, состоящей из нескольких уровней, конструкторы базовых классов вызываются начиная с самого верхнего уровня. После этого выполняются конструкторы тех элементов класса, которые являются объектами, в порядке их объявления в классе, а затем исполняется конструктор класса.

Сентябрь Пример вызовов конструкторов (1) Классы А, B, C и D образуют иерархию C D B A Классы X, Y, Z самостоятельные X Y Z Предположим, что класс A содержит в себе экземпляр класса X, класс B – экземпляр класса Y, класс C экземпляр класса Z. Все классы имеют конструкторы по умолчанию. Z Y X

Сентябрь Пример вызовов конструкторов (2) class A { public:A(); X x; …}; class B : public A { public:B(); Y y; …}; class C : public B { public:C(); Z z; …}; class D : public B { public:D();…}; class X { public:X();…}; class Y { public:Y();…}; class Z { public:Z();…};

Сентябрь Пример вызовов конструкторов (3) При создании экземпляра класса С вызов конструкторов будет происходить в следующей последовательности: С с; или С *с = new c; Вызывается конструктор класса С. 1. Вызывается конструктор класса B. 1. Вызывается конструктор класса А. 1. Вызывается конструктор для класса X. 2. Выполняется тело конструктора А. 2. Вызывается конструктор класса Y. 3. Выполняется тело конструктора B. 2. Вызывается конструктор класса Z. 3. Выполняется тело конструктора C.

Сентябрь Наследование деструкторов Деструкторы не наследуются, и если программист не описал в производном классе деструктор, он формируется по умолчанию и вызывает деструкторы всех базовых классов. Деструкторы не наследуются, и если программист не описал в производном классе деструктор, он формируется по умолчанию и вызывает деструкторы всех базовых классов. В отличие от конструкторов, при написании деструктора производного класса в нем не требуется явно вызывать деструкторы базовых классов, поскольку это будет сделано автоматически. В отличие от конструкторов, при написании деструктора производного класса в нем не требуется явно вызывать деструкторы базовых классов, поскольку это будет сделано автоматически. Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в порядке, строго обратном вызову конструкторов: сначала вызывается деструктор класса, затем деструкторы элементов класса, а потом деструктор базового класса. Для иерархии классов, состоящей из нескольких уровней, деструкторы вызываются в порядке, строго обратном вызову конструкторов: сначала вызывается деструктор класса, затем деструкторы элементов класса, а потом деструктор базового класса.

Сентябрь Последовательность вызовов деструкторов при вызове delete c; 1. Если в классе С определен деструктор, то выполняется его тело. 2. Выполняется деструктор для объекта z. 3. Выполняется деструктор для базового класса B 1. Если в классе B определен деструктор, то выполняется его тело. 2. Выполняется деструктор для объекта Y. 3. Выполняется деструктор для базового класса A. 1. Если в классе A определен деструктор, то выполняется его тело. 2. Выполняется деструктор для объекта X.

Сентябрь Операция присваивания Операция присваивания не наследуется. Операция присваивания не наследуется. Требуется явное определение операции присваивания в производном классе. Требуется явное определение операции присваивания в производном классе.

Сентябрь Пример использования операции присваивания (1) class man{ private: char *fio; …public: const man & operator=(man &m){ if(fio != NULL) delete [] fio; if(m.fio != NULL){ fio = new char[strlen(m.fio)+1]; strcpy(fio,m.fio);}else fio = NULL; return *this; }};

Сентябрь Пример использования операции присваивания (2) class business_man: public man{ private: unsigned long int many; …public: const business_man & operator=(business_man &m){ many = m.many; man::operator=(m); return *this; }};

Сентябрь Полиморфизм и виртуальные методы (1) Работа с объектами чаще всего производится через указатели. Работа с объектами чаще всего производится через указатели. Благодаря свойству полиморфизма указателю на базовый класс можно присвоить значение адреса объекта любого производного класса. Благодаря свойству полиморфизма указателю на базовый класс можно присвоить значение адреса объекта любого производного класса. Например: Например: class A {}; class B : public A{}; A *pointer; pointer = new B;

Сентябрь Полиморфизм и виртуальные методы (2) В каждом из классов опишем по методу с одинаковым названием. В каждом из классов опишем по методу с одинаковым названием. class A { public: void metod1(); …}; class B : public A{ public: void metod1(); …}; Вызов методов объекта происходит в соответствии с типом указателя, а не фактическим типом объекта, на который он ссылается, поэтому при выполнении оператора, например, A *pointer = new B; pointer->metod1(); будет вызван метод класса A, а не класса B, поскольку ссылки на методы разрешаются во время компоновки программы. Этот процесс называется ранним связыванием.

Сентябрь Полиморфизм и виртуальные методы (3) Чтобы вызвать метод класса B, можно использовать явное преобразование типа указателя: ((B *)pointer)->metod1(); Это не всегда возможно, поскольку в разное время указатель может ссылаться на объекты разных классов иерархии, и во время компиляции программы конкретный класс может быть неизвестен. Например: 1. Функция, параметром которой является указатель на объект базового класса. На его место во время выполнения программы может быть передан указатель на любой производный класс. 2. Связный список указателей на различные объекты иерархии, с которым требуется работать единообразно.

Сентябрь Полиморфизм и виртуальные методы (4) В C++ реализован механизм позднего связывания, когда разрешение ссылок на метод происходит на этапе выполнения программы в зависимости от конкретного типа объекта, вызвавшего метод. В C++ реализован механизм позднего связывания, когда разрешение ссылок на метод происходит на этапе выполнения программы в зависимости от конкретного типа объекта, вызвавшего метод. Этот механизм реализован с помощью виртуальных методов. Этот механизм реализован с помощью виртуальных методов. Виртуальным называется метод, ссылка на который разрешается на этапе выполнения программы. Виртуальным называется метод, ссылка на который разрешается на этапе выполнения программы.

Сентябрь Виртуальные методы Для определения виртуального метода используется спецификатор virtual, например: Для определения виртуального метода используется спецификатор virtual, например: class A { public: virtual void metod1(); …}; class B : public A{ public: virtual void metod1(); virtual void metod1();…};

Сентябрь Правила описания и использования виртуальных методов (1) Если в базовом классе метод определен как виртуальный, метод, определенный в производном классе с тем же именем и набором параметров, автоматически становится виртуальным, а с отличающимся набором параметров обычным. Если в базовом классе метод определен как виртуальный, метод, определенный в производном классе с тем же именем и набором параметров, автоматически становится виртуальным, а с отличающимся набором параметров обычным. class A { public: virtual void metod1(); …}; class B : public A{ public: void metod1();// виртуальный метод void metod1();// виртуальный метод void metod1(int a);// обычный метод void metod1(int a);// обычный метод…};

Сентябрь Правила описания и использования виртуальных методов (2) Виртуальные методы наследуются, то есть переопределять их в производном классе требуется только при необходимости задать отличающиеся действия. Права доступа при переопределении изменить нельзя. Виртуальные методы наследуются, то есть переопределять их в производном классе требуется только при необходимости задать отличающиеся действия. Права доступа при переопределении изменить нельзя. class A { public: virtual void metod1(); …}; class B : public A{ public:…}; A *pointer = new B; pointer->metod1();// допустимая операция будет вызван // метод класса A

Сентябрь Правила описания и использования виртуальных методов (3) Если виртуальный метод переопределен в производном классе, объекты этого класса могут получить доступ к методу базового класса с помощью операции доступа к области видимости. Если виртуальный метод переопределен в производном классе, объекты этого класса могут получить доступ к методу базового класса с помощью операции доступа к области видимости. class A { public: virtual void metod1(); …}; class B : public A{ public: void metod1(){ void metod1(){…A::metod1();…}…}; A *pointer = new B; pointer->metod1();

Сентябрь Правила описания и использования виртуальных методов (4) Если в базовом классе метод определен как виртуальный, метод, определенный в производном классе с тем же именем и набором параметров, автоматически становится виртуальным, а с отличающимся набором параметров обычным. Если в базовом классе метод определен как виртуальный, метод, определенный в производном классе с тем же именем и набором параметров, автоматически становится виртуальным, а с отличающимся набором параметров обычным. Виртуальные методы наследуются, то есть переопределять их в производном классе требуется только при необходимости задать отличающиеся действия. Права доступа при переопределении изменить нельзя. Виртуальные методы наследуются, то есть переопределять их в производном классе требуется только при необходимости задать отличающиеся действия. Права доступа при переопределении изменить нельзя. Если виртуальный метод переопределен в производном классе, объекты этого класса могут получить доступ к методу базового класса с помощью операции доступа к области видимости. Если виртуальный метод переопределен в производном классе, объекты этого класса могут получить доступ к методу базового класса с помощью операции доступа к области видимости. Виртуальный метод не может объявляться с модификатором statiс. Виртуальный метод не может объявляться с модификатором statiс.

Сентябрь Абстрактные классы и чисто виртуальные методы При описании класса можно описать виртуальный метод у которого нет реализации в данном классе. Для этого используется специальный синтаксис. При описании класса можно описать виртуальный метод у которого нет реализации в данном классе. Для этого используется специальный синтаксис. class A { public: virtual void metod1() = 0; …}; Такой метод называется чисто виртуальным. Такой метод называется чисто виртуальным. Класс, содержащий хотя бы один чисто виртуальный метод, называется абстрактным. Класс, содержащий хотя бы один чисто виртуальный метод, называется абстрактным. Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производных классах. Абстрактные классы предназначены для представления общих понятий, которые предполагается конкретизировать в производных классах. Абстрактный класс может использоваться только в качестве базового для других классов объекты абстрактного класса создавать нельзя, поскольку прямой или косвенный вызов чисто виртуального метода приводит к ошибке при выполнении. Абстрактный класс может использоваться только в качестве базового для других классов объекты абстрактного класса создавать нельзя, поскольку прямой или косвенный вызов чисто виртуального метода приводит к ошибке при выполнении.

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

Сентябрь Пример использования абстрактных классов class Figure { public: virtual void draw() = 0; …}; class Triangle : public Figure{ public: virtual void draw(); virtual void draw();…}; class Square : public Figure{ public: virtual void draw(); virtual void draw();…}; Figure *mas[2]; mas[0] = new Triangle(); mas[1] = new Square(); for(int i=0;i<2;i++) mas[i]->draw();

Сентябрь Множественное наследование Множественное наследование означает, что класс имеет несколько базовых классов. Множественное наследование означает, что класс имеет несколько базовых классов. Множественное наследование применяется для того, чтобы обеспечить производный класс свойствами двух или более базовых. Множественное наследование применяется для того, чтобы обеспечить производный класс свойствами двух или более базовых. Чаще всего один из этих классов является основным, а другие обеспечивают некоторые дополнительные свойства, поэтому они называются классами подмешивания. Чаще всего один из этих классов является основным, а другие обеспечивают некоторые дополнительные свойства, поэтому они называются классами подмешивания.

Сентябрь Иерархия классов при множественном наследовании Бобер Обитатель воды Обитатель суши Обитатель воздуха Летучая рыба Утка

Сентябрь Синтаксис множественного наследования class имя: [private|protected|public] базовый_класс 1, [private|protected|public] базовый_класс 2, …{ тело класса };

Сентябрь Пример множественного наследования class clX { public:clX(); int ValueX; …}; class clY { public:clY(); bool ValueY; …}; class clZ: public clX, public clY{ public:clZ(); double ValueZ; …};… clZ *z = new clZ; z->ValueX = 10; z->ValueY = true; z->ValueZ = 5.7; … delete z;

Сентябрь Проблемы множественного наследования Если в базовых классах есть одноименные элементы, при этом может произойти конфликт идентификаторов. Если в базовых классах есть одноименные элементы, при этом может произойти конфликт идентификаторов. Если у базовых классов есть общий предок, это приведет к тому, что производный от этих базовых класс унаследует два экземпляра полей предка, что чаще всего является нежелательным (ромбовидное наследование). Если у базовых классов есть общий предок, это приведет к тому, что производный от этих базовых класс унаследует два экземпляра полей предка, что чаще всего является нежелательным (ромбовидное наследование).

Сентябрь Пример устранения конфликта идентификаторов class clX { public:clX(); int ValueQ; …}; class clY { public:clY(); int ValueQ; …}; class clZ: public clX, public clY{ public:clZ();…};… clZ *z = new clZ; z->clX::ValueQ = 10; z->clY::ValueQ = 20; … delete z;

Сентябрь Конфликт двойного наследования общего предка Слушатель-автовладелец Автовладелец Слушатель Человек

Сентябрь Устранение конфликта двойного наследования предка class man { public:man(); char *fio; …}; class Listener : virtual public man { public: Listener (); int group; …}; class AutoOwner: virtual public man{ public:AutoOwner(); char GosN[9]; …}; class AutoListener: public Listener, public AutoOwner {public:AutoListener(); char propuskN[10]; …};

Сентябрь Шаблоны классов Шаблоны классов предназначаются для отделения алгоритмов от конкретных типов данных и позволяют создавать параметризованные классы. Шаблоны классов предназначаются для отделения алгоритмов от конкретных типов данных и позволяют создавать параметризованные классы. Параметризованный класс создает семейство родственных классов, которые можно применять к любому типу данных, передаваемому в качестве параметра. Параметризованный класс создает семейство родственных классов, которые можно применять к любому типу данных, передаваемому в качестве параметра. Наиболее широкое применение шаблоны находят при создании контейнерных классов. Наиболее широкое применение шаблоны находят при создании контейнерных классов. Контейнерным называется класс, который предназначен для хранения каким-либо образом организованных данных и работы с ними. Контейнерным называется класс, который предназначен для хранения каким-либо образом организованных данных и работы с ними. Преимущество использования шаблонов состоит в том, что как только алгоритм работы с данными определен и отлажен, он может применяться к любым типам данных без переписывания кода. Преимущество использования шаблонов состоит в том, что как только алгоритм работы с данными определен и отлажен, он может применяться к любым типам данных без переписывания кода.

Сентябрь Односвязный линейный список Признак последнего элемента в списке Указатель на следующий элемент списка ……

Сентябрь Класс для контейнера «стек целых чисел» class Stack{ private: struct DataElement{ int Value; struct DataElement *next; }; DataElement *first; public: Stack(){ first = NULL;} ~Stack(){ while(first != NULL) Pop();} void Push(int value){ DataElement *d = new DataElement(); d->Value = value; d->next = first; first = d; } int Pop(){ if(first == NULL) return 0; DataElement *d = first; first = first->next; int tmp = d->value; delete d; return tmp; }};

Сентябрь Использование контейнера «стек целых чисел» … Stack *st = new Stack(); st-> Push(10); st-> Push(15); st-> Push(20); int tmp = st->Pop(); tmp = st->Pop(); … delete st;

Сентябрь Синтаксис определения шаблона класса template определение_класса; Параметры шаблона перечисляются через запятую. Параметры шаблона перечисляются через запятую. В качестве параметров могут использоваться типы, шаблоны и переменные. В качестве параметров могут использоваться типы, шаблоны и переменные. Типы могут быть как стандартными, так и определенными пользователем. Типы могут быть как стандартными, так и определенными пользователем. Для их описания используется ключевое слово class. Для их описания используется ключевое слово class. Внутри шаблона параметр типа может применяться в любом месте, где допустимо использовать спецификацию типа. Внутри шаблона параметр типа может применяться в любом месте, где допустимо использовать спецификацию типа.

Сентябрь Шаблон для контейнера «Стек» template class Stack{ private: struct DataElement{ T Value; struct DataElement *next; }; DataElement *first; public: Stack(){ first = NULL;} ~Stack(){ while(first != NULL) Pop();} void Push(T value){ DataElement *d = new DataElement(); d->Value = value; d->next = first; first = d; } T Pop(){ if(first == NULL) return 0; DataElement *d = first; first = first->next; T tmp = d->value; delete d; return tmp; }};

Сентябрь Использование шаблона «стек» (1) Stack *st = new Stack (); st-> Push(10); st-> Push(15); int tmp = st->Pop(); tmp = st->Pop (); … delete st; … Stack *st = new Stack (); st-> Push(10.6); st-> Push(15.7); double tmp = st->Pop (); tmp = st->Pop (); … delete st; … Stack *st = new Stack (); st-> Push(new Listener()); Listener *tmp = st->Pop (); tmp = st->Pop(); … delete st;

Сентябрь Описание методов вне шаблона template template возвр_тип имя_класса :: имя_функции (список_параметров функции) Например: template template T Stack ::Pop() {…}

Сентябрь Вопросы к экзамену ООП. Понятия абстракции, абстрактного типа данных, парадигмы. Парадигма ООП. Выбор степени абстракции. Развитие ООП. Преимущества и недостатки ООП. ООП. Понятия абстракции, абстрактного типа данных, парадигмы. Парадигма ООП. Выбор степени абстракции. Развитие ООП. Преимущества и недостатки ООП. ООП. Инкапсуляция, наследование, полиморфизм. ООП. Инкапсуляция, наследование, полиморфизм. Язык С++. Реализация инкапсуляции. Язык С++. Реализация инкапсуляции. Язык С++. Реализация наследования. Язык С++. Реализация наследования. Язык С++. Полиморфизм и виртуальные функции. Абстрактные классы. Язык С++. Полиморфизм и виртуальные функции. Абстрактные классы. Язык С++. Множественное наследование. Язык С++. Множественное наследование. Язык С++. Шаблоны классов. Язык С++. Шаблоны классов.