Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   returning pure virtual object (http://www.velocityreviews.com/forums/t955913-returning-pure-virtual-object.html)

Philipp Kraus 12-28-2012 08:08 PM

returning pure virtual object
 
Hello,

I have got two pure virtual class like

class Base1 {
public :
virtual Base2 getReturn( void ) const = 0;
}


class Base2 {
public :
virtual void doSomething() = 0;
}


My implementated classes shows


class myReturn : public Base2 { .... }

class myObj : public Base1 {
public :

myObj() : m_data( myReturn() );

Base2 getReturn() { return m_data }

private :
myReturn m_data
}

On g++ I get an error "invalid initialization of reference of type". I would
like to return a reference or copy of the internal object and I need only, that
it is a derivated object from my pure virtual class.

How can I do this in a correct way?

Thanks for the explanation

Phil


Victor Bazarov 12-28-2012 08:46 PM

Re: returning pure virtual object
 
On 12/28/2012 3:08 PM, Philipp Kraus wrote:
> I have got two pure virtual class like


They are actually called "abstract classes". "Pure" are the member
functions.

>
> class Base1 {
> public :
> virtual Base2 getReturn( void ) const = 0;


'Base2' seems undefined here.

> }

;

and try to avoid putting "void" between parentheses. You're being
inconsistent (you didn't do that in the 'Base2' in the declaration of
the 'doSomething' member), and it's a C-ism.
>
>
> class Base2 {
> public :
> virtual void doSomething() = 0;
> }

;
>
>
> My implementated classes shows
>
>
> class myReturn : public Base2 { .... }


What's in '...'? Does it actually implement 'doSomething'?

>
> class myObj : public Base1 {
> public :
>
> myObj() : m_data( myReturn() );


Actually, "m_data()" should suffice.

>
> Base2 getReturn() { return m_data }


This 'getReturn' does not override the 'Base1::getReturn' -- they have
different types. Perhaps you meant

Base2 getReturn() const { return m_data; }

However, that won't do either. It *slices* the return value and
converts (or, rather, attempts to convert) the object of the derived
type ('myReturn') to the base class, which is *abstract*. IOW, it tries
to *instantiate* an object of an abstract class.

>
> private :
> myReturn m_data


;

> }

;

What's wrong with your keyboard? You seem to be missing a whole lot of
semicolons...

>
> On g++ I get an error "invalid initialization of reference of type". I
> would
> like to return a reference or copy of the internal object and I need
> only, that
> it is a derivated object from my pure virtual class.


You can't return a copy. In order to return a copy the return value of
the function has to be of the derived type. You *can* return a
reference to the base class, but you will need to change the declaration
of your 'getReturn' member to something like

const Base2& getReturn() const;

> How can I do this in a correct way?


"Correct" depends on the requirements. What are you trying to accomplish?

V
--
I do not respond to top-posted replies, please don't ask


All times are GMT. The time now is 06:58 AM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57