Alf P. Steinbach wrote:
> * Thomas J. Gritzan:
>> 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();
>
> That would make the code compile, but would defeat the pupose of the code.
That would be with your code change:
virt_base* my_virt_derived = new virt_derived();
virt_base* new_virt_derived = my_virt_derived->cut();
No need for covariant return types, since both pointers are virt_base* and
virt_base::cut returns virt_base*.
Since we want to show how to use covariant return types, we have to declare
both pointers as virt_derived*.
I guess one of us needs a cup of coffee again :-)
--
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