Вопрос

Что именно это означает от technical point of view, Я понял, что это значит, что мой derived class всегда можно преобразовать в base class, это оно? Я прочитал некоторые материалы без каких-либо ссылок на технические аспекты, только философия! заранее спасибо

Это было полезно?

Решение

Это означает, что мой полученный класс всегда может быть преобразован в базовый класс

На самом деле это значит лучше, чем это. int всегда можно преобразовать в float, но это не означает, что int "- это« поплавок ». Это просто означает, что поплавок можно построить из int. Точно так же вы можете иметь пользовательские классы, которые преобразуют, но не имеют других отношений.

С наследством указатель или ссылка на полученный класс всегда могут быть преобразованы в указатель или ссылку на базовый класс [*]. То есть целью производного класса может стоять вместо объекта базового класса. На самом деле это одна из тех вещей. Если человек может стоять на хирурге мозга, тогда они хирург мозга.

Одно формальное определение, если «это» - Барбара Лискова Принцип замены. Отказ Что по общему признанию, по-прежнему философия, но это очень звуковая философия, и она напрямую относится к тому, как вы пишете программы.

Другая вещь, которую вы должны поддерживать прямые при использовании наследования в C ++, это разница между полиморфизмом выполнения (достигнута с использованием virtual Функции) и статический полиморфизм (который на самом деле не требует наследства вообще). С помощью не виртуальных вызовов функций версия вызываемой функции всегда является версией, определенной в классе, что компилятор сообщает, что объект имеет (статический тип). Это может на самом деле не работать правильно, если он перегружен в полученный класс. С виртуальными вызовами версия называется версия, определенная в классе, объект на самом деле представляет собой (динамический тип). Важно решить, какой из двух видов «- это« вы стремиться ».

*] И объект должен быть достоверно доступен через указатель, то есть. Вы всегда можете принуждать типы указателей с reinterpret_cast, но это не то, что я имею в виду здесь. И есть некоторые справочные детали - если базовый класс неоднозначен, то вы не можете преобразовать указатель за один ход, но вы можете сделать это явно, используя несколько однозначных отливок. Если базовый класс не доступен, то вы могу Преобразовать его, но только с литым стилем C-Chyst, а не безпрямым. Литые акты в стиле C действуют как static_cast который игнорирует доступность, не как reinterpret_class. Отказ Таким образом, вы получаете рабочий указатель, но, надеюсь, также сильный смысл, что вы делаете что-то очень неверное ;-)

Другие советы

Полученный класс может быть преобразован только в доступный и однозначный базовый класс на данной точке R. Нет недостатки ссылок и какое другое место, чем сам стандарт C ++.

$ 10.2 - это хорошая ссылка: полученный класс может служить базовым классом, подверженным контролю доступа; Смотрите 11.2. Указатель на полученный класс может быть неявно преобразован в указатель на доступный однозначный базовый класс (4.10). Lvalue из полученного типа класса может быть связан со ссылкой на доступный однозначный базовый класс (8.5.3). - Примечание

И снова

$ 10.3 - «Базовый спецификатор-список указывает тип субъектов базового класса, содержащийся в объекте полученного типа класса. Субъекта классной базы. [...

С точки зрения принципов OAD:

Я бы лично рекомендовал Статьи Роберта Мартина Для получения хорошего удержания этого особенно принцип OCP. Мне невозможно побить четкость и полномочий, с которыми автор объясняет эти легендарные руководящие принципы OAD

Также посмотрите на LSP, как объяснено в пост @steves '

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top