4.2. Доступ к полям и функциям базового класса

Функция или поле базового класса могут быть определены заново в производном классе. Такой член базового класса называется переопределенным.

При обращении к переопределенной функции будет вызвана ближайшая по иерархии функция. Если в этом случае требуется вызов функции из базового класса или вызов внешней функции, то применяется оператор разрешения области видимости ::, например:

#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 {  };