4.2. доступ к полям и функциям базового класса
Функция или поле базового класса могут быть определены заново в производном классе. Такой член базового класса называется переопределенным. При обращении к переопределенной функции будет вызвана ближайшая по иерархии функция. Если в этом случае требуется вызов функции из базового класса или вызов внешней функции, то применяется оператор разрешения области видимости ::, например:
#include <iostream.h> //библиотека потокового ввода-вывода void f() { cout << “ Внешняя функция” } struct Base1 //первый класс { void f() { cout << “ Функция из Base1”;} }; struct Base2 //второй класс { void f() { cout << “ Функция из Base2;”} }; struct Deriv: Base1, Base2 //класс, производный от двух данных классов { void f() {::f();} // вызов внешней функции }
int main() { Deriv obj; //создаём объект класса Deriv f(); obj.Base1::f(); obj.Base2::f(); obj.f(); return 0; }
В результате работы программы будут выведены следующие строки:
Внешняя функция Функция из Base1 Функция из Base2 Внешняя функция
В последнем случае будет вызвана функция f() объекта производного класса, которая в свою очередь вызовет внешнюю функцию. При наследовании статус доступа к полям и собственным функциям базового класса изменяется следующим образом: если перед базовым классом указан атрибут private, то: открытые члены базового класса переходят в закрытые в производном классе, защищенные – в закрытые, закрытые - в недоступные.
Если перед базовым классом используется атрибут public, то: открытые члены базового класса переходят в открытые в производном классе, защищенные – в защищенные, закрытые – в недоступные.
Более подробно эти преобразования приведены в табл. 4.1:
Таблица 4.1
В таблице отражено преобразование статуса доступа как для классов, определенных с помощью ключевого слова struct, так и для классов, заданных с помощью class. Например:
Class A: protected B { }; Struct A: B { };
|
| Оглавление| |