лекции программирование / polevoy_cpp_2012_spring_lecture_08
.pdfПодстановочный критерий (нестрогая формулировка)
•в любой точке вызова базового класса м.б. использован производный класс
или
•любой экземпляр производного класса является допустимым экземпляром родительского класса
31.03.2012 |
cppNewb.ru |
21 |
Конструирование производных объектов
•конструктор базового класса д.б. вызван
•умолчательные конструкторы базовых классов м.б. вызваны неявно компилятором
31.03.2012 |
cppNewb.ru |
22 |
Список инициализации (пример)
Student::Student(
const string& name
,const string& secname
,const Group& group)
:Man(name, secname) , m_group(group)
{
}
31.03.2012 |
cppNewb.ru |
23 |
Конструктор производного класса
•должен
–инициализировать базовый класс
–инициализировать собственные поля
•непосредственная инициализация полей базового класса невозможна
31.03.2012 |
cppNewb.ru |
24 |
Порядок вызова конструкторов
•по всей цепочке иерархии наследования, начиная от корневого базового класса и до текущего
•на каждом уровне вызывается
–конструктор базового класса
–конструкторы внутренних объектов
31.03.2012 |
cppNewb.ru |
25 |
Деструктор
•каждый класс содержит единственный деструктор (без аргументов)
•компилятор гарантирует вызов всех
деструкторов (по всей иерархии наследования)
31.03.2012 |
cppNewb.ru |
26 |
Порядок вызова деструкторов
•обратный порядку вызова конструкторов
•по всей цепочке иерархии наследования, начиная от текущего и до корневого базового класса
•на каждом уровне вызывается
–деструкторы внутренних объектов
–деструктор базового класса
31.03.2012 |
cppNewb.ru |
27 |
Замещение метода
•в производном классе м.б. определен метод с именем метода базового класса
•переопределение перегруженного имени функции базового класса скрывает все остальные версии в производном классе
31.03.2012 |
cppNewb.ru |
28 |
Изменение интерфейса (в т.ч. замещение)
•изменение интерфейса базового класса посредством модификации сигнатуры и/или типа возвращаемого значения означает, что класс используется не тем способом, для которого обычно предназначается наследование
31.03.2012 |
cppNewb.ru |
29 |
Доступ к скрытым именам
• осуществляется через полное имя
пример:
void
Derived::print(ostream& ostr)
{
Base::print(ostr);
…
}
31.03.2012 |
cppNewb.ru |
30 |