Ковариантность и контравариантность (программирование): различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Строка 9:
 
== Реализация в языках ==
{{редактирую раздел|1=[[Служебная:Contributions/Yms|Yms]]|2=08:32, 20 июня 2013 (UTC)}}
=== C++ ===
C++ начиная со стандарта 1998 года поддерживает ковариантные типы возврата в перекрытых [[виртуальный метод|виртуальных функциях]]:
Строка 30 ⟶ 29 :
</source>
 
<!-- [[Указатель (тип данных)|Указатели]] в C++ ковариантны: в качественапример, указателяуказателю на базовый класс в выражениях можно использоватьприсвоить указатель на дочерний класс.-->
 
[[Шаблоны C++]], вообще говоря, инвариантны, отношения наследования классов-параметров на шаблоны не переносится. Если бы, например, контейнер <code>vector</code> был ковариантен, то можно было бы, имея <code>vector<Cat></code>, присвоить ссылку на него переменной типа <code>vector<Animals>&</code> и записать туда объект типа <code>Dog</code>, поместив таким образом объект Dog в <code>vector<Cat></code> в обход контроля типов, что нежелательно. Однако при помощи параметризованных конструкторов копирования и операторов присваивания можно создать [[умный указатель]], ковариантный по своему параметру-типу, подобно обычному указателю<ref>{{cite web|url=http://blog.deliciousmuffins.net/on-covariance-and-c-templates.html|title=On covariance and C++ templates|date=2013-02-08|accessdate=2013-06-20}}</ref>.
 
=== Java ===
Строка 42 ⟶ 41 :
 
=== C# ===
{{редактирую раздел|1=[[Служебная:Contributions/Yms|Yms]]|2=08:32, 20 июня 2013 (UTC)}}
 
== Примечания ==