
- •5)Указатели и ссылки.
- •12) Параметры структурных типов.
- •13) Классы памяти переменных.
- •14) Параметры-функции.
- •15) Правила, определяющие видимость переменных в функциях.
- •16) Пространства имен.
- •Int Pages;
- •Int getPages(); // тело будет описано в book.Сpp
- •18) Перегрузка функций.
- •19) Функции с параметрами по умолчанию.
- •20) Текстовые файлы. Отличие от Delphi Pascal.
- •Int fscanf(file *stream,const char *format[,adress,...]);
- •Int fprintf(file *stream,const char *format[,argument,...]);
- •21) Двоичные файлы. Отличие от Delphi Pascal.
- •22) Определение класса, компоненты класса. Ограничение доступа.
- •23) Инициализация полей при отсутствии конструктора.
- •24) Конструкторы. Инициализация полей при наличии конструктора.
- •25) Деструкторы.
- •27) Простое и множественное наследование классов.
- •28) Наследование. Ограничение доступа при наследовании.
- •29) Конструкторы и деструкторы производных классов.
- •30) Композиция.
- •31)Наполнение
- •32) Полиморфное наследование. Простой полиморфизм.
- •33) Полиморфное наследование. Сложный полиморфизм.
- •34) Статические компоненты классов.
- •35) Особенности работы с динамическими объектами.
- •36) Объекты с динамическими полями. Копирующий конструктор.
- •Void Print(tPoint r) {…}
- •37) Дружественные функции, методы и классы.
- •38) Переопределение операций.
- •39) Шаблоны классов.
- •40) Шаблоны функций.
- •46) Сигналы, слоты и события Qt.
33) Полиморфное наследование. Сложный полиморфизм.
Для построения иерархий классов в любом языке программирования должен быть предусмотрен механизм полиморфизма, обеспечивающий возможность определения разных аспектов некоторого единого по названию метода для классов различных уровней иерархии. При этом различают простой полиморфизм, базирующийся на механизме раннего связывания, и сложный полиморфизм, использующий механизм позднего связывания.
Для получения правильного результата в некоторых случаях необходимо использование сложного полиморфизма. Он реализуется механизмом позднего связывания и требует описания виртуальных функций.
Виртуальными называются функции, которые объявляются с использованием ключевого слова virtual в базовом классе и переопределяются (замещаются) в одном или нескольких производных классах. При этом прототипы функций в разных классах должны совпадать не только по именам, но также по типу возвращаемого результата и сигнатуре, хотя алгоритмы, реализуемые такими функциями, как правило, отличаются между собой. Если типы функций различны, то механизм виртуальности для них не включается.
Как уже упоминалось выше, при использовании виртуальных функций
нужный аспект полиморфной функции, вызываемой из метода базового класса,
определяется на этапе выполнения, когда известно, для какого объекта вызван
метод: объекта базового класса или объекта производного. Аналогично, если
вызов функции осуществляется через указатель на базовый класс, нужный
аспект функции вызывается в зависимости от того, адрес объекта какого класса
будет содержать указатель.
34) Статические компоненты классов.
Класс - это тип, а объект - конкретный представитель этого класса в программе. Для каждого объекта существует своя копия полей класса. Если все объекты одного типа используют некоторые данные совместно, то возникает проблема размещения этих данных и обеспечения их доступности из всех объектов класса. Решение возможно путем
применения механизма статических компонент.
Статическими называются компоненты класса, объявленные с модификатором памяти static. Такие компоненты являются частью класса, но не включаются в объекты этого класса. Имеется ровно одна копия статических полей класса - общая для всех объектов данного класса, которая существует даже при отсутствии объектов данного класса. Инициализация статических полей класса осуществляется только вне определения класса, но с указанием описателя видимости <имя класса>::.
Принципиально любой метод класса может обратиться к статическому полю и изменить его значение. Но существует возможность обращения к статическим полям класса при отсутствии объектов данного класса. Такой доступ осуществляется с помощью статических компонентных функций - компонентных функций, объявленных со спецификатором static. Статические функции не ассоциируются с каким-либо объектом и не получают параметра this. Следовательно, ови не могут без указания объекта обращаться к нестатическим полям класса. При необходимости ссылка на конкретный объект может быть передана в списке параметров, и тогда статическая функция может обратиться к нестатическим полям объекта следующим образом: <имя объекта>.<имя нестатического поля класса>. При обращении к статическим полям класса такой проблемы не возникает.
При обращении к статическим компонентам класса, являющимся принадлежностью всех объектов данного класса, можно вместо имени объекта указать имя класса:
<класс>: :<компонент>.