- •Ооп Экзамен 2020
- •4. Низкоуровневый
- •2. Какие отличия между указателем и ссылкой?
- •3. Что такое rvlaue и lvalue переменные?
- •4. Что такое rvalue и lvalue ссылки?
- •5. Как связаны lvalue и rvalue ссылки и переменные?
- •6. Что такое ооп?
- •15. Что такое указатель на функцию и как он может быть использован?
- •22. Что такое выравнивание памяти в структурах и классах?
- •23. Что такое инвариант класса?
- •24. В чем отличие функций от методов?
- •37. В каких случаях используется перегрузка конструкторов?
- •38. Какую цель может преследовать создание приватного конструктора?
- •45. Каково время жизни объекта?
- •46. Зачем нужен виртуальный деструктор?
- •48. В чем различие delete и delete[]?
- •49. Что подразумевается под идиомой raii?
- •50. Перечислите основные подходы к обработке ошибок.
- •51. Для чего предназначен механизм обработки исключительных ситуаций?
- •52. Что такое исключение?
- •54. Как происходит возбуждение исключения?
- •55. Кто отвечает за обработку возникших исключительных ситуаций?
- •56. Какие 3 уровня гарантии в механизме исключений?
- •Строгая гарантия “если при выполнении операции возникает исключение, то это не должно оказать какого-либо влияния на состояние приложения ”.
- •57. Что такое раскрутка стека?
- •66. Время жизни агрегируемого объекта меньше времени жизни агрегата?
- •67. Какие классы называются дружественными, для каких целей используется это
- •75. Как осуществить вызов базовой реализации функции при её переопределении в
- •76. Как связаны виртуальные функции и полиморфизм?
- •77. Что такое переопределение функций?
- •78. Работает ли переопределение для приватных функций?
- •79. Что такое таблица виртуальных функций?
- •80. Как себя ведут виртуальные функции в конструкторе и деструкторе?
- •81. В каких случаях допустимо приведение указателей/ссылок на дочерний класс к
- •82. Что такое чистая виртуальная функция?
- •83. Какой класс называется абстрактным?
- •85. Что такое перегрузка функций?
- •86. Как ведет себя перегрузка при наследовании?
- •87. Опишите процесс выбора функции среди перегруженных.
- •88. Чем отличаются механизмы раннего и позднего связывания?
- •89. Что такое множественное наследование?
- •95. Что такое динамическое приведение типов?
- •Динамическое приведение указателя
- •96. Что такое константное приведение типов? const_cast — константное приведение типов данных
- •98. Что такое умные указатели?
- •116. Какие особенности использования dynamic_cast, его отличия от static_cast?
- •117. Что такое шаблоны классов?
- •118. Что такое шаблоны функций?
- •119. Как осуществляется вывод аргументов шаблона?
- •120. Что может быть параметром шаблона?
- •121. Что такое специализация шаблонов?
- •122. Что такое нешаблонная база?
- •123. Что такое странно рекурсивный шаблон?
- •124. Какая разница между typedef и using?
- •125. Что такое ключевое слово decltype?
- •126. Что такое принципы solid?
- •127. Что такое принцип единственной ответственности?
- •128. Что такое принцип открытости/закрытости?
- •129. Что такое принцип подстановки Барбары Лисков?
- •130. Что такое принцип разделения интерфейса?
- •131. Что такое принцип инверсии зависимостей?
- •133. Что такое шаблон проектирования?
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 может быть использована для преобразования одного типа в другой, но она не должна быть использована для выполнения недопустимого преобразования, например, преобразование значения в указатель или наоборот.