Объективное программирование
Методическое пособие - Компьютеры, программирование
Другие методички по предмету Компьютеры, программирование
о перед вызовом этого конструктора будут вызваны конструкторы без параметров для входящих в него объектов старого класса. И наоборот, после вызова деструктора для объекта нового класса будут вызваны деструкторы вложенных объектов старого класса.
Однако при конструировании вложенных объектов им желательно передавать параметры. Поэтому при описании конструктора объекта нового класса можно в заголовке в явном виде указать тот вид конструктора объекта старого класса, который требуется. Кроме того, его параметры могут зависеть от параметров вызова конструктора нового класса:
class man
{
char name[20]; // Другие элементы класса
dat dat1; // Дата рождения
dat dat2; // Дата поступления на работу
public:
man(char *,char *,char *); // Конструкторы
man(char *);
}
//----- Конструктор класса man с неявным вызовом конструкторов
// для dat1 и dat2 без параметров
//----------------------------------------------------- man::man(char *p)
{
}
//----- Конструктор класса man с явным вызовом конструкторов
// для dat1 и dat2 с параметрами
//--------------------------------------------------------- man::man(char *p,char *p1, char *p2) : dat1(p1), dat2(p2)
{
// --- Тело конструктора ---
}
Вызов конструктора для ------------------
вложенного объекта dat1
В качестве параметра передается -------------
строка - второй параметр вызова
конструктора для класса man Вызов конструктора для
вложенного объекта dat2
void main ------ Строка конструктора man
{
man JOHN("John","8-9-1958","15-1-1987");
} L------ Строка передается
Строка передается конструктору объекта
конструктору объекта dat2 в объекте man
dat1 в объекте man
6.2 Производные классы
---------------------
Другой случай вложенности классов основывается на понимании
класса как совокупности данных и операций над ними. При этом
принцип вложенности рассматривается как создание нового "производного" класса, который включает в себя все или большую часть
свойств старого "базового" класса, или "наследует" их: структура
объекта старого класса включается в новый объект, а все элементы-функции старого класса применимы к объекту нового класса, точнее к его старой составляющей.
Старый класс при этом называется базовым классом (БК), новый
- производным классом (ПК).
Синтаксис определения производного класса имеет вид:
class
{
определение приватной и публичной части
производного класса
}
Перечислим основные свойства базового и производного классов:
- объект базового класса определяется в производном классе как неименованный. Это значит, что он не может быть использован в явном виде как обычный именованный объект;
- элементы данных базового класса включаются в объект производного класса (как правило, компилятор размещает их в начале объекта производного класса). Oднако приватная часть базового класса закрыта для прямого использования в производном классе;
- элементы-функции базового класса "наследуются" в производном классе, то есть вызов функции, определенной в базовом классе, для объекта производного класса возможен и понимается как вызов ее для входящего в него объекта базового класса;
- в производном классе можно переопределить наследуемую функцию, которая будет вызываться вместо наследуемой. При этом для выполнения соответствующих действий над объектом базового класса она может включать явный вызов переопределяемой функции.
Пример схемы определения производного класса
class a
{
public:
void f() {}
void g() {}
}
class b : a ------------------------ базовый класс
{
public: void f() -------------------- "f" переопределяется
{ ...
a::f(); -------------- явный вызов "f" для БК
} -------------- "g" наследуется из БК
void h() {} -------------- собственная функция в ПК
}
void main()
{
a A1;
b B1;
B1.f(); --------------- вызов переопределенной b::f()
B1.g(); --------------- вызов наследуемой a::f()
}
Понятие "наследования" предполагает что при вызове в производном классе функций, наследуемых из базового, транслятор производит преобразование ссылки this на объект производного класса в
ссылку на входящий в него объект базового класса, учитывая размещение последнего в объекте производного класса.
Взаимоотношение конструкторов и деструкторов базового и производного классов аналогичны выше описанным:
- если конструктор производного класса определен обычным образом, то сначала вызывается конструктор базового класса без параметров, а затем конструктор производного класса. Деструкторы
вызываются в обратном порядке - сначала для производного, затем
для базового;
- в заголовке конструктора производного класса может быть
явно указан вызов конструктора базового класса с параметрами. Он
может быть без имени, а может быть с именем базового класса. Если
производный класс включает в себя объекты нескольких базовы