Я думаю, это потому, что члены и методы данных базового класса не будут доступны, но мне хотелось бы больше ясности в этом. Кроме того, является ли это причиной того, что полиморфизм (с использованием виртуальных функций) возможен только при публичном наследовании?
возможный дубликат общедоступного и частного наследования в C++ — person g3nair schedule 21.05.2013
На самом деле указатель на базу может указывать на производный класс, даже если база является закрытой. Дело в том, что такое преобразование невозможно из вне класса. Однако такое преобразование по-прежнему возможно выполнить в контексте, когда база доступна.
Пример:
Живой пример
Живой пример с виртуальным вызовом
@Энгью, понял! большое спасибо! но мне все же хотелось бы более глубокого понимания того, почему полиморфизм во время выполнения разрешен только при публичном наследовании. — person g3nair; 21.05.2013
@ g3nair Что вы имеете в виду под полиморфизмом во время выполнения? Вы имеете в виду преобразование производных в базовые? Если это так, причина в том, что открытое наследование представляет собой IS-A, в то время как защищенное/частное наследование обычно называется реализованным в терминах. — person g3nair; 21.05.2013
под полиморфизмом времени выполнения я имею в виду тот полиморфизм, который реализуется с использованием базового указателя и виртуальных функций. — person g3nair; 21.05.2013
@ g3nair g3nair Как я только что показал выше, он работает и с непубличным наследованием. — person g3nair; 21.05.2013
Вопрос оператора заключался в том, почему, а не в том, что действительно, а что нет. Есть ли какое-то обоснование для принятия такого решения? Объясняется ли это обоснованием в каких-либо стандартных документах С++ iso? — person g3nair; 22.11.2019
Если я прав, вы спрашиваете о видимости элементов внутри класса. Как вы сказали, public/protected/private повлияет на доступность ваших членов/функций членов/методов. (см. Разницу между частным, общедоступным и защищенным наследованием) Однако полиморфизм не ограничивается открытым наследованием.
пример:
Вот пример, который поможет вам лучше понять
Теперь в этой программе давайте посмотрим, что может делать объект производного класса. Объект производного класса может
Теперь давайте посмотрим, что произойдет, если указатель Base сможет сделать, если он будет указывать на такой объект. Для указателя базового класса
Итак, теперь вы можете видеть двусмысленность, с которой столкнется базовый указатель, если он указывает на объект класса, унаследованного в частном отношении.
Неоднозначность: в соответствии с производным классом объект foo является закрытым, но базовый указатель считает его общедоступным.
Таким образом, мораль частного или защищенного наследования теряется, если такие вещи были разрешены. Надеюсь, это рассеет ваши сомнения.