Group: comp.lang.c++
From: "Alf P. Steinbach"
Date: Sunday, February 10, 2008 12:18 PM
Subject: Re: Covariant return types doesn't work (with g++ 4.1.2)

* mr.xiaofan.li@gmail.com:
>
> I have been totally confused about the covariant return type feature
> in C++. Below is an example code I wrote that doesn't compile with g++
> 4.1.2 (on Fedora 8)
>
> class virt_base

Note that the term "virtual base (class)" has a special meaning in C++.

Your class "virt_base" is not used as a virtual base class.


> {
> public:
> virt_base()
> {
> }
>
> virtual ~virt_base()
> {
>
> }
>
> virtual virt_base* cut()
> {
> return new virt_base();
> }
>
> void say_hi()
> {
> cout <<"hi!!! " <> }
> };
>
> class virt_derived
> : public virt_base
> {
> public:
> virt_derived()
> {
> }
>
> ~virt_derived()
> {
>
> }
>
> virtual virt_derived* cut()
> {
> return new virt_derived();
> }
>
> void say_hi()
> {
> cout <<"HI!!!! " <> }
> };
>
> int main()
> {
> virt_base* 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*'

Please be a little more conscientious with your quoting. This code
can't be copied and compiled. It must be manually reformatted.

The problem is simply that virt_base::cut() returns a virt_base*.

So you're initializing a virt_derived* pointer with a virt_base* pointer.

Declare new_virt_derived as

virt_base* new_virt_derived = ...

In addition, to get the result I think you expect, you'll have to
declare say_hi as virtual in virt_base.


> new_virt_derived->say_hi();
> }


Cheers, & hth.,

- 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?

Safety Articles | Usenet Groups | 20lbs in 30 days