Ответы на некоторые вопросы по С++ (4 стр)
Автор: PP
базовому
public - is a (наследование интерфейса)
private, protected - наследование реализации
111. Какие функции не наследуются?
Конструкторы и operator=
112. Сформулируйте правила написания конструкторов в производном классе.
???
113. Каков порядок вызова конструкторов? А деструкторов?
Порядок конструирования объекта:
базовые виртуальные классы
таблица виртуальных классов
базовые классы
таблица виртуальных функций
члены ("поля")
сам класс
Деструктор - в обратном порядке.
114. Можно ли в производном классе объявлять новые поля? А методы?
Да. Да.
115. Если имя нового поля совпадает с именем унаследованного, то каким образом разрешить конфликт имен?
Пользовать BASE::Name
116. Что происходит, если имя метода-наследника совпадает с именем базового метода?
Происходит перекрытие имен. Решение - 115.
Подстава в том что перекрывается не только совпадающие функции, а вообще все с таким именем.
117. Сформулируйте принцип подстановки.
LSP: Subtypes must be substitutable for their base types.
118. Когда выполняется понижающее приведение типов?
Когда у программы плохой дизайн :))
119. Объясните, что такое «срезка» или «расщепление».
Это когда какой-нибудь идиот передает объект в функцию, принимающую базовый класс по значению, класс наследник.
120. Объясните, зачем нужны виртуальные функции.
Для реализации динамического полиморфизма.
121. Что такое связывание?
Определение того какая функция должна быть вызвана.
122. Чем «раннее» связывание отличается от «позднего»?
Раннее - на этапе компиляции (разрешение перегрузки), позднее - на этапе выполнения (виртуальные функции).
123. Какие два вида полиморфизма реализованы в С++?
Статический и динамический.
124. Дайте определение полиморфного класса.
Класс с виртуальными функциями.
125. Может ли виртуальная функция быть дружественной функцией класса?
Да.
126. Наследуются ли виртуальные функции?
Да.
127. Каковы особенности вызова виртуальных функций в конструкторах и деструкторах?
Механизм виртуальных функций не работает.
128. Можно ли сделать виртуальной перегруженную операцию, например, сложение?
Да.
129. Может ли конструктор быть виртуальным? А деструктор?
Нет. Да.
130. Как виртуальные функции влияют на размер класса?
Указателем на таблицу виртуальных функций.
131. Как объявляется «чистая» виртуальная функция?
struct A { virtual voif f() = 0; };
132. Дайте определение абстрактного класса.
Класс содержащий хотя бы одну чисто виртуальную функцию.
133. Наследуются ли чистые виртуальные функции?
Да. (иначе зачем они нужны :) )
134. Можно ли объявить деструктор чисто виртуальным?
Да.
135. Чем отличается чистый виртуальный деструктор от чистой виртуальной функции?
Он обязан иметь определение. (т.к. будет вызван)
136. Зачем требуется определение чистого виртуального деструктора?
Чтобы сделать класс абстрактным.
Наверное правильно было бы ответить и на вопрос:
136.(1) Зачем требуется определение виртуального деструктора?
Чтобы корректно удалять объекты по указателю на базовый класс.
137. Наследуется ли определение чистой виртуальной функции?
Нет.
138. Приведите классификацию целей наследования.
Наследование интерфейса и наследование реализации
139. Объясните разницу наследования интерфейса от наследования реализации.
28 июля 2006 (Обновление: 13 янв 2009)