Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭКЗ_2020_ООП.odt
Скачиваний:
23
Добавлен:
23.06.2020
Размер:
217.5 Кб
Скачать

81. В каких случаях допустимо приведение указателей/ссылок на дочерний класс к

базовому?

Только при public наследовании.

82. Что такое чистая виртуальная функция?

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

83. Какой класс называется абстрактным?

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

Предназначен для хранения общей реализации и поведения некоторого множества дочерних классов

Объекты абстрактного класса создать нельзя

Может содержать чисто виртуальный деструктор

84. Как в С++ реализуются интерфейсы?

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

85. Что такое перегрузка функций?

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

86. Как ведет себя перегрузка при наследовании?

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

87. Опишите процесс выбора функции среди перегруженных.

C++ пытается найти точное совпадение. Это тот случай, когда фактический аргумент точно соответствует типу параметра одной из перегруженных функций.

Если точного совпадения не найдено, то C++ пытается найти совпадение путём дальнейшего неявного преобразования типов.

Если неявное преобразование невозможно, то C++ пытается найти соответствие посредством стандартного преобразования.

C++ пытается найти соответствие путём пользовательского преобразования.

88. Чем отличаются механизмы раннего и позднего связывания?

Раннее связывание (или ещё «статическая привязка») означает, что компилятор (или линкер) может напрямую связать имя идентификатора (например, имя функции или переменной) с машинным адресом.

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

89. Что такое множественное наследование?

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

90. Что такое ромбовидное наследование?

Ромбовидное наследование — ситуация, когда два класса B и C наследуют от A, а класс D наследует от обоих классов B и C. При этой схеме наследования может возникнуть неоднозначность: если метод класса D вызывает метод, определенный в классе A, а классы B и C по-своему переопределили этот метод, то не понятно от какого класса его наследовать.

91. Какой существует механизм разрешения проблемы ромбовидного наследования в

С++?

Нужно использовать виртуальное наследование. Таким образом у нас будет создан только один объект класса предка.

92. Как представлены объекты в памяти при виртуальном наследовании?

Class A{};

class B: virtual public A {}

class C: virtual public A {}

class D: public B, public C {}

В памяти: [B::vbptr]

| B |

[C::vbptr]

| C |

| D |

| A |

93. Как реализовано приведение типов в Си?

Мы определяем какой нам тип нужен для переменной и обозначаем выбранный тип в скобках. Компилятор создаёт дополнительную переменную, тип которой оказывается тем, что указан нами в круглых скобках, а значение в ту созданную временную переменную приходит из приводимого объекта.

94. Что такое статическое приведение типов?

static_cast преобразует выражения одного статического типа в объекты и значения другого статического типа. Поддерживается преобразование численных типов, указателей и ссылок по иерархии наследования как вверх, так и вниз. Проверка производится на уровне компиляции, так что в случае ошибки сообщение будет получено в момент сборки приложения или библиотеки.

------------------------------------------------------------------------------------------------------------------------

static_cast — унарная операция приведения типов данных в С++

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