Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет ЛР 8.docx
Скачиваний:
1
Добавлен:
31.08.2019
Размер:
234.5 Кб
Скачать

5.Как организовать использование указателя на базовый класс для доступа к методам (не виртуальным) производного класса ? в каком случае деструкторы объявляются виртуальными?

При работе с объектами производных классов через указатель на базовый класс может произойти ошибка при уничтожении объектов производных классов. Базовый класс ничего не знает о деструкторах производных классов, поэтому будет вызван деструктор базового класса перед уничтожением части объекта производного класса, унаследованной от базового класса. Деструкторы производных классов вызваны не будут. Чтобы этой ошибки не было деструкторы базовых классов всегда следует объявлять виртуальными.

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

Если нужно использовать указатель на базовый класс для доступа к специфичным методам производного класса, то указатель на базовый класс следует привести к типу производного класса. Для этого используется оператор dynamic_cast

#include <iostream>

#include <conio.h>

class Mammal // Класс млекопитающее

{ protected:

Int itsAge; // возраст

public:

Mammal():itsAge(1) {}

virtual ~Mammal(){}

Virtual void Speak() const

{ std::cout << "Mammal speak!\n ";}

};

2.Множественное наследование – понятие, синтаксис объявления производного класса.

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

Синтаксис объявления производного класса при множественном наследовании: после имени производного класса ставится двоеточие, за которым следует список указанных через запятую имен базовых классов, каждое из которых предваряется спецификатором доступа (ключевым словом public, protected или private, определяющим доступ к данным базового класса внутри производного).

Объявление базового класса производится обычным способом.

Конструктору производного класса при множественном наследовании, помимо собственных параметров, следует передать все параметры, необходимые конструкторам всех базовых классов.

В списке инициализации конструктора производного класса явно вызываются конструкторы базовых классов, которым передаются требуемые значения параметров.

При создании объекта производного класса конструкторы вызываются слева направо в порядке записи базовых классов при объявлении производного класса.

6.Понятие и назначение чистых виртуальных функций и абстрактных классов.

Чисто виртуальная функция – это виртуальная функция, тело которой не определено. Она используется для того, чтобы отложить выбор реализации функции.

Класс, имеющий хотя бы одну чисто виртуальную функцию, называется абстрактным классом.

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

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

3.Понятие и виды полиморфизма в С++. Статический полиморфизм в С++: понятие, механизмы реализации.

Слово "полиморфизм" греческого происхождения и означает "имеющий много форм".

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

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

Статический полиморфизм реализуется в С++ с помощью механизмов переопределения и перегрузки.

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

Переопределять в С++ можно методы класса. Переопределяемый метод базового класса и переопределяющий его метод производного класса должны совпадать не только по именам, но также по типу возвращаемого параметра и сигнатуре.

Вопросы (часть 2)