Урок №160. Сокрытие методов родительского класса

   | 

   | 

 Обновлено 12 Сен 2018  | 

 213

C++ дает возможность изменить спецификатор доступа родительского члена в дочернем классе. Это делается с помощью using declaration. Например, рассмотрим следующий класс Parent:

Поскольку Parent::printValue() объявлен как protected, то он доступен только другим членам Parent и своим дочерним классам. Для других объектов доступ к нему закрыт.

Определим класс Child, который изменяет спецификатор доступа printValue() с protected на public:

Это означает, что следующий код выполнится без ошибок:

Два примечания.

Во-первых, вы можете изменить спецификаторы доступа только тех членов родительского класса, к которым есть доступ у дочернего класса. Вы не сможете изменить спецификатор доступа члена родительского класса с private на protected или public, поскольку дочерний класс не имеет доступа к членам private родительского класса.

Во-вторых, с C++11 использование using declarations является предпочтительным способом изменения спецификаторов доступа. Однако вы также можете использовать «access declaration». Это работает идентично using declaration, только без ключевого слова «using». Сейчас этот способ считается устаревшим, но, читая более старый код, вы можете это увидеть, поэтому об этом стоит знать.

Сокрытие родительских методов в дочернем классе

В C++ невозможно удалить или ограничить функционал родительского класса, кроме как непосредственного изменения исходного кода. Однако в дочернем классе вы можете скрыть функционал, существующий в родительском классе, так чтобы к нему нельзя было получить доступ через объекты дочернего класса. Это делается путем изменения соответствующих спецификаторов доступа.

Например, вы можете сделать открытый член родительского класса закрытым:

Это позволяет инкапсулировать данные родительского класса в дочернем классе. В качестве альтернативы можно использовать наследование типа private, что приведет к тому, что все наследуемые члены public и protected класса Parent станут private в классе Child.

Вы также можете закрыть родительские методы в дочернем классе, используя ключевое слово delete:

Таким образом, компилятор будет жаловаться, если мы попытаемся вызвать метод getValue() через объект класса Child. Однако через объект родительского класса всё будет работать, так как мы «удалили» getValue() только в дочернем классе.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 оценок, среднее: 5,00 из 5)
Загрузка...
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО