Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Что такое contravariance?  (Прочитано 8156 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 26-09-2009 09:38 » new

При поиске синтаксиса указателя на метод с++ объекта столкнулся с термином contravariance ....

Что это такое?

К какой области компьютерных наук относится\определен?

P.S. пробовал почитать про него в Википедии, оказалось слишком непонятно написано.
« Последнее редактирование: 27-09-2009 19:28 от Вад » Записан

1n c0de we trust
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 27-09-2009 20:06 » 

В недрах RSDN-а нашёл лаконичное объяснение этих понятий:
Цитата
Ковариантность — это когда неявное ссылочное преобразование у сконструированных типов действует в ту же строну, что и у типов-аргументов. Контравариатность (противо-вариантность) — когда в противоположную (например, если IConsumer<object> можно неявно привести к IConsumer<string>).
То есть, контравариантность применительно к типам - это возможность неявного приведения к подтипу.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 28-09-2009 10:26 » 

те если я правильно понял:

class B: public A {};
void f(B* pb){ A* pa=pb } // пример ковариантности?

иными словами операция = в отношении lvalue указателя ковариантна?

а как тогда выглядит контрвариантный объект в коде?
Записан

1n c0de we trust
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 28-09-2009 11:04 » 

Цитата
операция = в отношении lvalue указателя ковариантна?
Скорее, система типов в целом ковариантна, поскольку позволяет неявно приводить к предку, обеспечивая то, что при поиске подходящей реализации оператора будет найден A::operator=(const& A) (или какой он там).

Контравариантность - наверное, что-то вроде
Код:
template <class Child>
class A {
public:
    // ну например
    Child Foo(){ return *this; }
};

class B: public A<B>
{
public:
    B(A<B>& parent){ /*...*/ }
};
WTL, например, широко практикует подобную технику "родитель знает о ребёнке".
« Последнее редактирование: 28-09-2009 11:54 от Вад » Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 28-09-2009 11:17 » 

вроде, что такое ковариантность теперь понял, во всяком случае
Скорее, система типов в целом ковариантна, поскольку позволяет неявно приводить к предку...
понятнее, цитаты рсдн

насчет контрвариантности, меня терзает смутное сомнение, что она имеет какое-то логическое отношение к указателю на член класса - но какое я пойму, имхо, только после прочтения александреску

зы логическое рассуждения типа: контравариантность это неявное приведение предка к потомку - высаживает мозг полностью
Записан

1n c0de we trust
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 28-09-2009 11:53 » 

зы логическое рассуждения типа: контравариантность это неявное приведение предка к потомку - высаживает мозг полностью
Ну, такое может быть для случаев:
Код:
class A {};

class B : public A
{
public:
    B(const A&){} // конструктор B с параметром A
}

void foo(B value);
foo( A() );

или, скажем, можно сделать это преобразование прямо частью предка.
Код:
class A 
{
public:
    template<class T> T* getChild(){ return dynamic_cast<T*>(this); }
}
или использовать более хитрую проверку наследуемости, как у того же Александреску. В любом случае, задать оператор преобразования типа A в тип B : public A
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines