· в производном классе у наследуемой функции базового класса может быть "разная судьба".
Поясним последнее утверждение. Пусть в классе В определен метод f() и класс С является производным от В. Возможны три варианта:
1) Производный класс получает функцию B::f() без каких-либо изменений.
2) Производный класс может заменить унаследованную функцию B::f() своей функцией C:: f(). У функции класса С та же спецификация параметров, сигнатуры различаются только квалификаторами. В этом случае говорят, что метод производного класса переопределяет ("экранирует") одноименный метод базового класса.
3) Производный класс может определить функцию с тем же именем, но с другой спецификацией параметров — имеет место перегрузка.
Конструкторы и деструкторы при наследовании
Конструкторы не наследуются - они создаются в производном классе (если не определены программистом явно). Система поступает с конструкторами следующим образом:
- если в базовом классе нет конструкторов или есть конструктор без аргументов (или аргументы присваиваются по умолчанию), то в производном классе конструктор можно не писать - будут созданы конструктор копирования и конструктор без аргументов;
|
|
- если в базовом классе все конструкторы с аргументами, производный класс обязан иметь конструктор, в котором явно должен быть вызван конструктор базового класса;
- при создании объекта производного класса сначала вызывается конструктор базового класса, затем - производного.
Деструктор класса, как и конструкторы, не наследуется, а создается. С деструкторами система поступает следующим образом:
- при отсутствии деструктора в производном классе система создает деструктор по умолчанию;
- деструктор базового класса вызывается в деструкторе производного класса автоматически независимо от того, определен он явно или создан системой;
- деструкторы вызываются (для уничтожения объектов) в порядке, обратном вызову конструкторов.
Создание и уничтожение объектов выполняется по принципу LIFO: последним создан — первым уничтожен.