Group: comp.lang.c++
From: "Thomas J. Gritzan"
Date: Sunday, February 10, 2008 12:49 PM
Subject: Re: Covariant return types doesn't work (with g++ 4.1.2)

mr.xiaofan.li@gmail.com wrote:
> class virt_base
> {
[...]
> virtual virt_base* cut()
> {
> return new virt_base();
> }
[...]
> };
>
> class virt_derived
> : public virt_base
> {
[...]
> virtual virt_derived* cut()
> {
> return new virt_derived();
> }
[...]
> };

The covariant return type lets you override a function with a more strict
function, i.e. a function returning a derived type. However, type checking
is done at compile time, so your compiler has to know, that the object you
are calling cut() on is a virt_derived.

> int main()
> {
> virt_base* my_virt_derived = new virt_derived();

Change this to
virt_derived* my_virt_derived = new virt_derived();

> virt_derived* new_virt_derived = my_virt_derived->cut(); // g++
> complains here: invalid
> //
> conversion from 'virt_base*' to
> //
> 'virt_derived*'
> new_virt_derived->say_hi();
> }

--
Thomas
http://www.netmeister.org/news/learn2quote.html
An ideal world is left as an excercise to the reader.
--- Paul Graham, On Lisp 8.1