Это совершенно другой вопрос, чем тот, который я задавал ранее, поэтому я публикую это.
Я хотел бы определить мою тему как субъективный вопрос, который вдохновляет ответы, которые объясняют «почему» и «как». Это разрешено согласно Центр помощи правила.
Чтобы сделать мой вопрос более конструктивным, я предоставляю вам ресурсы, которые лучше объясняют мою тему.
От C ++ SuperFAQ под вопросом
«Можете ли вы дать мне простую причину, по которой виртуальные функции (динамическое связывание, динамический полиморфизм) и шаблоны (статический полиморфизм) имеют большое значение?»
Автор говорит, «… программист может написать некоторый код, который вызывается фреймворком, написанным их пра-пра-дедушкой. Нет необходимости изменять код пра-пра-дедушки. Фактически, для динамического связывания с виртуальными функциями он не даже не нужно перекомпилировать. Даже если все, что у вас осталось, это объектный файл и исходный код, который написал пра-прадедушка, был утерян 25 лет назад, этот древний объектный файл будет вызывать новое расширение без каких-либо изменений. «
Он продолжает говорить, «Это расширяемость, а это ОО и универсальное программирование для мощной многократно используемой абстракции».
Кроме того, я недавно прочитал статью, написанную создателем C ++ Бьярном Страуструпом, под названием «Почему C ++ не просто объектно-ориентированный язык программирования«. В своей работе он определяет язык или технику как объектно-ориентированные, если и только если они непосредственно поддерживают:
Абстракция — предоставление некоторой формы классов и объектов.
Наследование — предоставление возможности создавать новые абстракции из существующих.
Полиморфизм во время выполнения — предоставление некоторой формы связывания во время выполнения.
Он также кратко упоминает общее программирование.
6.7 Общее программирование — основная тема в C
Сообщество ++ в течение последних нескольких лет занималось разработкой методик, использующих шаблонный механизм.
Из чтения этих двух ресурсов я могу понять, как старый код может использовать новый код с помощью объектно-ориентированной парадигмы. Однако я не понимаю, как старый код может использовать новый код с помощью универсального программирования (в данном случае шаблонов), потому что универсальное программирование использует статическое связывание. Из моего предыдущего связанного вопроса Бен Фойгт прокомментировал это,
«Чтобы «старый» код шаблона был объединен с «новым» кодом шаблона, необходимо, чтобы оба были скомпилированы вместе.«
C ++ SuperFAQ Кажется, подразумевается (как для OO, так и для общего программирования), что старый код не должен быть перекомпилирован с новым кодом, чтобы использовать новый код, и что вам просто нужен объектный файл из старого кода. Тем самым поддерживается повторное использование кода.
Может ли кто-нибудь ответить на вопрос «почему» и «как», объектный файл старого кода может использовать новый код, который использует общую парадигму программирования, даже если шаблоны статически связаны?
Я хотел бы объяснить ответ ниже более подробно, так как он поможет мне понять больше и может помочь другим понять. Так как универсальное программирование использует статическое связывание, исходный код старого кода и новый код должны быть скомпилированы «все вместе» для повторного использования кода вступить в силу. Это означает, что если у вас есть только объектный файл старого кода, вы не сможете использовать новый код с ним, так как для этого потребуется динамическое / позднее связывание, связывание во время выполнения.
Краткий ответ: не может. Я предполагаю, что это было то, что было сказано в первом предложении ответа, который вы связали:
[Акцент добавлен]Они могут улучшить повторное использование, позволяя старому коду вызывать новый код, предоставляемый во время выполнения (виртуальные функции) или время компиляции (шаблоны).
Чтобы существующий код использовал шаблоны, вы делать придется перекомпилировать. Это означает, что вы должны начинать с (некоторой формы) исходного кода, а не с объектных файлов (по крайней мере, с того, что большинство людей воспринимают как обычные объектные файлы, в любом случае).
Я утверждаю, что старый код не только должен быть перекомпилирован для использования нового кода, но также должен быть изменен для использования нового кода, т.е. A * a = new A => A * a = new B, даже если A содержит функцию-член, объявленную с виртуальным ключевым словом, и B переопределил ее.