Re: Covariant return types doesn't work (with g++ 4.1.2)
* Thomas J. Gritzan:
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 :-)
Heh.
I seems I need to stop pointing out my own mistakes (like the coffee
thing), lest people think that someone who does that is mistaken all the
time or most of the time -- but I refuse to cater to such perceptions.
You're partially right. There are two things to show. First, that that
covariant function works as an override (needing a virt_base* to show
that), which I consider primary, otherwise it wouldn't need to be
virtual, and your suggestion doesn't call the virtuality into play.
Second, that when the static type my_virt_derived is known the covariant
function provides a way to avoid casting, and your suggestion does that.
Cheers,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?