Функция или поле базового класса могут быть определены заново в производном классе. Такой член базового класса называется переопределенным.
При обращении к переопределенной функции будет вызвана ближайшая по иерархии функция. Если в этом случае требуется вызов функции из базового класса или вызов внешней функции, то применяется оператор разрешения области видимости ::, например:
#include <iostream.h> //библиотека потокового ввода-вывода
void f()
{
cout << “nВнешняя функция”
}
struct Base1 //первый класс
{
void f() { cout << “nФункция из Base1”;}
};
struct Base2 //второй класс
{
void f() { cout << “nФункция из 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 |
||
public |
отсутствует |
public |
private |
protected |
отсутствует |
public |
private |
private |
отсутствует |
недоступны |
недоступны |
public |
public |
public |
public |
protected |
public |
protected |
protected |
private |
public |
недоступны |
недоступны |
public |
protected |
protected |
protected |
protected |
protected |
protected |
protected |
private |
protected |
недоступны |
недоступны |
public |
private |
private |
private |
protected |
private |
private |
private |
private |
private |
недоступны |
недоступны |
В таблице отражено преобразование статуса доступа как для классов, определенных с помощью ключевого слова struct, так и для классов, заданных с помощью class. Например:
Class A: protected B { };
Struct A: B { };