Почему библиотека ввода-вывода и библиотека диагностики используют наследование?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему библиотека ввода-вывода и библиотека диагностики используют наследование?

Сообщение Anonymous »

Большая часть Стандартной библиотеки C++ использует шаблоны, а не наследование для реализации полиморфизма¹. Это одна из хорошо известных тем о том, почему². И на эту тему есть сотни видеороликов и сообщений в блогах.
Однако, что касается частей стандартной библиотеки, которые используют наследование, я могу только думать о
  • библиотека диагностики, в которой все исключения, сгенерированные стандартной библиотекой, наследуются от std::Exception,
  • и ввода/ выходная библиотека, содержащая дюжину классов, связанных между собой иерархией наследования, которая также имеет ромб.
Что касается диагностической библиотеки, я думаю, причина в том, что исключения могут проходить через несколько TU, и нужно иметь возможность их перехватывать, даже если неизвестен точный тип. И только динамический полиморфизм позволяет это. (См. ½ ответа.)
Мой вопрос: какие особые требования/ограничения/цели/что-то делают эти 2 части стандартной библиотеки библиотека ввода-вывода должна удовлетворять требованиям (или требуется!³) их использовать наследование?

(¹) Да, шаблоны реализуют статический полиморфизм и динамический полиморфизм наследования, но именно поэтому я задаю этот вопрос. В конце концов, алгоритмы стандартной библиотеки работают через шаблон именно потому, что все их определения доступны в заголовках. Если бы по какой-то причине требовалось, чтобы алгоритмы компилировались независимо, а затем связывались с клиентскими программами, тогда (насколько я понимаю) алгоритмы должны были бы использовать некоторый тип стирания типов, следовательно, некоторые тип полиморфизма времени выполнения.
(²) Да, вопрос относится к STL. Но я думаю, даже принимая двусмысленность, я думаю, что диспропорция между шаблонными и виртуальными частями библиотеки все еще сохраняется.
(³) Интересно, были бы эти две библиотеки разработаны по-разному, на основе Модули C++20.
(⁴) Уточнение: я не ищу ответов типа (со ссылкой на диагностическую библиотеку) "О, это довольно просто! Это потому что вы хотите, чтобы std::logic_error, std::runtime_error и другие исключения реализовывали то, что, поэтому вы можете вызвать .what для исключения, фактически не зная его конкретного типа !", потому что однопроходные алгоритмы также "хотят", чтобы их входные данные итераторов реализовывали операторы++ и оператор*, но они не требуют, чтобы все итераторы имели общий базовый класс! р>

Подробнее здесь: https://stackoverflow.com/questions/791 ... nheritance
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»