Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1
Кент Рейсдорф. BORLAND C++BUILDER. Страница 88
Замена функции базового класса функцией производного класса называется замещением (overriding) функции.
Чтобы произошло замещение, функция производного класса должна в точности совпадать с функцией базового класса. Иными словами, типы возвращаемых значений, имена функций и списки параметров должны быть одинаковыми.
Вы можете использовать замещение для изменения функции базового класса или ее расширения. Рассмотрим, например, функцию TakeOff(). Если вы хотите полностью изменить работу функции TakeOff() класса Airplane, определите в классе MilitaryPlane следующую функцию:
void MilitaryPlane::TakeOff(int dir) {
// новый код
}
Но если вы хотите, чтобы ваша функция дополнительно сохранила все возможности функции базового класса, вызовите сначала прежнюю функцию:
void MilitaryPlane::TakeOff(int dir) {
Airplane::TakeOff(dir) ; // новый код
Для расширения возможностей функции базового класса, вы можете добавить соответствующий код до или после ее вызова. Оператор разрешения видимости используется для указания компилятору, что вызывается функция TakeOff() класса Airplane. Заметьте, что функция TakeOffQ объявлена в разделе protected класса Airplane. Если бы она находилась в разделе private, этот вызов был бы невозможен, т.к. даже производные классы не имеют доступа к закрытым членам класса-предка. Делая функцию TakeOff() защищенной, вы скрываете ее от внешнего мира, но оставляете доступной для производных классов.
Когда вы создаете класс на основе другого класса, необходимо правильно инициализировать базовый класс путем вызова соответствующего конструктора. Конструктор базового класса вызывается в списке инициализаторов. Вот как это будет выглядеть для класса Military Plane:
MilitaryPlane::MilitaryPlane(char* _name)