Полиморфизм и оператор присваивания в C - PullRequest
0 голосов
/ 02 февраля 2019

Я видел следующее высказывание об операторе присваивания = в C.

В операторе присваивания есть скрытые типы полиморфизма:

  1. Принудительный полиморфизм - когда мы делаем неявное приведение между типами.

  2. Параметрический полиморфизм - Учтите, что оператор присваивания определен для каждого типа в PL (атомарного и для пользовательского с struct и enum).

Я понимаю первое высказывание о Coercion, но я не понимаю, почему и как оператор присваивания поддерживает параметрический полиморфизм.Могу ли я привести пример, поясняющий это утверждение?

EDIT : Это было в книге о концепции PL (написано на другом языке).Сказать, что он имеет полиморфизм принуждения с неявным принуждением, выглядит примерно так:

int number = 4.5;
// number = 4

То, что C не имеет полиморфизма, не соответствует действительности.Кстати перегрузка тоже полиморфизм, и (конечно) это возможно в C.

1 Ответ

0 голосов
/ 02 февраля 2019

Как часто бывает с техническими и научными терминами, существует некоторое разнообразие в использовании и толковании терминов «полиморфный» и «полиморфизм».Когда люди говорят, что C не поддерживает полиморфизм, они, скорее всего, имеют в виду, что он не поддерживает полиморфизм subtype , как его могут назвать те, кто любит более широко использовать общий термин.Вопреки вашему утверждению, он также не поддерживает ad hoc полиморфизм, то есть перегрузку.

Даже если мы принимаем принуждение типов как форму полиморфизма - что не является основной позицией -принимая заявление о том, что C не поддерживает полиморфизм вне его надлежащего контекста, вы создали соломенного человека.Скорее это раздражает, чем заискивает, и, полагаю, это была не мудрая стратегия, если вы на самом деле ищете ответ, а не пытаетесь начать спор.

Что касается вашего очевидного вопроса,однако,

Я понимаю первое высказывание о Принуждении, но я не понимаю, почему и как оператор присваивания поддерживает параметрический полиморфизм.Могу ли я привести пример, поясняющий это утверждение?

Полагаю, текст означает, что оператор = параметризован типом его левого операнда, поскольку поведение этого оператора меняется,в некотором смысле, в зависимости от этого типа.В частности, правый операнд преобразуется в тип левого операнда, и специфика присваивания может интерпретироваться также в зависимости от этого типа.

Но я считаю сомнительным характеризовать этокак параметрический полиморфизм.Отличительной чертой параметрического полиморфизма обычно является где-то явный параметр .Шаблоны - это то, о чем обычно говорят люди, когда ссылаются на параметрический полиморфизм в C ++, а в C нет шаблонов.Тем не менее, можно считать, что C11 имеет ограниченную форму параметрического полиморфизма при обобщенном выборе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...