Kiedy kowariancja C ++ jest najlepszym rozwiązaniem?

To pytanie zostałem zapytany tutaj kilka godzin temu i uświadomiłem sobie, że nigdy nie użyłem typów powrotów kowariantnych w moim własnym kodzie. Dla tych, którzy nie są pewni, jaka jest kowariancja, pozwala na to, aby typ powrotu (zazwyczaj) funkcji wirtualnych był różny, pod warunkiem, że typy są częścią tej samej hierarchii dziedziczenia. Na przykład:

struct A {
   virtual ~A();
   virtual A * f();
   ...
};

struct B : public A {
   virtual B * f();
   ...
};

Mówi się, że różne typy powrotu dwóch funkcji f () są kowariantne. Starsze wersje C ++ wymagały, aby typy powrotu były takie same, więc B musiałoby wyglądać tak:

struct B : public A {
   virtual A * f();
   ...
};

Tak więc moje pytanie: Czy ktoś ma przykład ze świata rzeczywistego, w którym wymagane są typy funkcji wirtualnych zwracających kowariant, czy też dają lepsze rozwiązanie po prostu zwracając wskaźnik bazowy lub referencję?

questionAnswers(6)

yourAnswerToTheQuestion