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