Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   What the hell is dynamic_cast for? (http://www.velocityreviews.com/forums/t617311-what-the-hell-is-dynamic_cast-for.html)

lovecreatesbea...@gmail.com 05-28-2008 05:40 PM

What the hell is dynamic_cast for?
 
Suppose I have the following three classes,

GrandBase <-- Base <-- Child <-- GrandChild

The following cast expression holds true only if pBase points object
of type of ``Child'' or ``GrandChild'', i.e. types not upper than
Child in the above class hierarchy,

dynamic_cast<Child*>pBase

Do I draw this correctly?

Up-casting is safe while down-casting is not. dynamic_cast seems to do
down-casting, so why is dynamic_cast intenting to do the dangerous
work?

Juha Nieminen 05-28-2008 05:46 PM

Re: What the hell is dynamic_cast for?
 
lovecreatesbea...@gmail.com wrote:
> Up-casting is safe while down-casting is not. dynamic_cast seems to do
> down-casting, so why is dynamic_cast intenting to do the dangerous
> work?


Dynamic casting is intended to do the "dangerous work" more safely.
While a static_cast will simply cast to the derived type regardless of
whether the object is of that type, dynamic cast actually checks that
the object is of that type, and if it isn't, it returns a null pointer.
You can check the returned pointer to see if the cast was successful.
(With static_cast you probably just get a segmentation fault.)

There are situation where downcasting may be unavoidable or the path
of least resistance. Thus it's good to have a tool to make it safer.

Fernando Gˇmez 05-28-2008 07:07 PM

Re: What the hell is dynamic_cast for?
 
On May 28, 12:48 pm, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
> lovecreatesbea...@gmail.com wrote:
> > Suppose I have the following three classes,

>
> > GrandBase <-- Base <-- Child <-- GrandChild

>
> > The following cast expression holds true only if pBase points object
> > of type of ``Child'' or ``GrandChild'', i.e. types not upper than
> > Child in the above class hierarchy,

>
> > dynamic_cast<Child*>pBase

>
> > Do I draw this correctly?

>
> You missed the parentheses and your class has to be polymorphic (have at
> least one virtual function).


Wouldn't that be: "have a vritual destructor"?

David C├┤me 05-28-2008 07:15 PM

Re: What the hell is dynamic_cast for?
 
On Wed, 28 May 2008 21:07:26 +0200, Fernando G├│mez
<fernando.a.gomez.f@gmail.com> wrote:

> On May 28, 12:48 pm, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
>> lovecreatesbea...@gmail.com wrote:
>> > Suppose I have the following three classes,

>>
>> > GrandBase <-- Base <-- Child <-- GrandChild

>>
>> > The following cast expression holds true only if pBase points object
>> > of type of ``Child'' or ``GrandChild'', i.e. types not upper than
>> > Child in the above class hierarchy,

>>
>> > dynamic_cast<Child*>pBase

>>
>> > Do I draw this correctly?

>>
>> You missed the parentheses and your class has to be polymorphic (have at
>> least one virtual function).

>
> Wouldn't that be: "have a vritual destructor"?


No. He is right.

Fernando Gˇmez 05-28-2008 07:17 PM

Re: What the hell is dynamic_cast for?
 
On May 28, 2:15 pm, David C˘me <davidc...@wanadoo.fr> wrote:
> On Wed, 28 May 2008 21:07:26 +0200, Fernando Gˇmez
>
>
>
> <fernando.a.gome...@gmail.com> wrote:
> > On May 28, 12:48 pm, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
> >> lovecreatesbea...@gmail.com wrote:
> >> > Suppose I have the following three classes,

>
> >> > GrandBase <-- Base <-- Child <-- GrandChild

>
> >> > The following cast expression holds true only if pBase points object
> >> > of type of ``Child'' or ``GrandChild'', i.e. types not upper than
> >> > Child in the above class hierarchy,

>
> >> > dynamic_cast<Child*>pBase

>
> >> > Do I draw this correctly?

>
> >> You missed the parentheses and your class has to be polymorphic (have at
> >> least one virtual function).

>
> > Wouldn't that be: "have a vritual destructor"?

>
> No. He is right.


So, can you have a polymorphic class without a virtual destructor?

Erik Wikstr├Âm 05-28-2008 07:39 PM

Re: What the hell is dynamic_cast for?
 
On 2008-05-28 21:07, Fernando G├│mez wrote:
> On May 28, 12:48 pm, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
>> lovecreatesbea...@gmail.com wrote:
>> > Suppose I have the following three classes,

>>
>> > GrandBase <-- Base <-- Child <-- GrandChild

>>
>> > The following cast expression holds true only if pBase points object
>> > of type of ``Child'' or ``GrandChild'', i.e. types not upper than
>> > Child in the above class hierarchy,

>>
>> > dynamic_cast<Child*>pBase

>>
>> > Do I draw this correctly?

>>
>> You missed the parentheses and your class has to be polymorphic (have at
>> least one virtual function).

>
> Wouldn't that be: "have a vritual destructor"?


No, any functions will do. Note that the destructor is a member function
(thought a special one).

--
Erik Wikstr├Âm

Marcel MŘller 05-28-2008 09:04 PM

Re: What the hell is dynamic_cast for?
 
lovecreatesbea...@gmail.com wrote:
> Suppose I have the following three classes,
>
> GrandBase <-- Base <-- Child <-- GrandChild
>
> The following cast expression holds true only if pBase points object
> of type of ``Child'' or ``GrandChild'', i.e. types not upper than
> Child in the above class hierarchy,


In case of multiple inheritance it becomes a bit more complicated. In
fact it returns a non-null pointer to Child if and only if the cast to
Child* is valid. But it may also be a cross cast where Child is neither
derived from Base nor a superclass of it.

> dynamic_cast<Child*>pBase
>
> Do I draw this correctly?
>
> Up-casting is safe while down-casting is not. dynamic_cast seems to do
> down-casting, so why is dynamic_cast intenting to do the dangerous
> work?


dynamic_cast is the C++ way of checking whether a polymorphic object is
of a certain type at runtime. You need this e.g. for type specific
dispatching. I would not call this 'dangerous work'.


Marcel

lovecreatesbea...@gmail.com 05-29-2008 01:49 AM

Re: What the hell is dynamic_cast for?
 
On May 29, 1:46 am, Juha Nieminen <nos...@thanks.invalid> wrote:
> lovecreatesbea...@gmail.com wrote:
> > Up-casting is safe while down-casting is not. dynamic_cast seems to do
> > down-casting, so why is dynamic_cast intenting to do the dangerous
> > work?

>
> Dynamic casting is intended to do the "dangerous work" more safely.
> While a static_cast will simply cast to the derived type regardless of
> whether the object is of that type,


Hi, thank you.

dynamic_cast<T>(pointer) is used with an object pointer, while
static_cast<T>(object) is the implicitly compatible conversion and
works with objects also. Am I right?

> dynamic cast actually checks that
> the object is of that type, and if it isn't, it returns a null pointer.
> You can check the returned pointer to see if the cast was successful.
> (With static_cast you probably just get a segmentation fault.)


``is of that type'' means that

dynamic_cast<T>(pointer);

(*pointer) is declared as T or T's derived classes, right?

This cast fails if (*pointer) is declared as T's parent classes or
other un-related classes. Am I right?

> There are situation where downcasting may be unavoidable or the path
> of least resistance. Thus it's good to have a tool to make it safer.


I read some past posts, some said dynamic_cast indicated flaw in
design :)

lovecreatesbea...@gmail.com 05-29-2008 01:53 AM

Re: What the hell is dynamic_cast for?
 
On May 29, 1:48 am, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
> lovecreatesbea...@gmail.com wrote:
> > Suppose I have the following three classes,


That should be four :) , I added GrandBase but forgot to change the
number.

>
> > GrandBase <-- Base <-- Child <-- GrandChild

>
> > The following cast expression holds true only if pBase points object
> > of type of ``Child'' or ``GrandChild'', i.e. types not upper than
> > Child in the above class hierarchy,

>
> > dynamic_cast<Child*>pBase

>
> > Do I draw this correctly?

>
> You missed the parentheses and your class has to be polymorphic (have at
> least one virtual function). That's first. And second, the expression
>
> dynamic_cast<Child*>(pBase)
>
> has the type 'Child*', and not "holds true", although it will evaluate
> to (Child*)0 if the cast fails.
>


Yes, thank you for correcting me.

James Kanze 05-29-2008 08:13 AM

Re: What the hell is dynamic_cast for?
 
On May 29, 3:49 am, "lovecreatesbea...@gmail.com"
<lovecreatesbea...@gmail.com> wrote:
> On May 29, 1:46 am, Juha Nieminen <nos...@thanks.invalid> wrote:


> > lovecreatesbea...@gmail.com wrote:
> > > Up-casting is safe while down-casting is not. dynamic_cast
> > > seems to do down-casting, so why is dynamic_cast intenting
> > > to do the dangerous work?


> > Dynamic casting is intended to do the "dangerous work" more
> > safely. While a static_cast will simply cast to the derived
> > type regardless of whether the object is of that type,


> dynamic_cast<T>(pointer) is used with an object pointer, while
> static_cast<T>(object) is the implicitly compatible conversion
> and works with objects also. Am I right?


Both dynamic_cast and static_cast can be used on pointers and
references. (static_cast can also be used in a lot of other
cases.) When used on pointers or references:

-- static_cast allows moving up or down in the hierarchy (but
not sideways); it also allows converting to or from void*.
When moving down (Base* to Derived*), it makes no
verifications; if the object actually pointed to isn't a
Derived, anything can happen, so it is extremely dangerous
for this sort of casting. Note too that there are some
restrictions on static_cast when virtual base classes are
involved.

-- dynamic_cast only makes sense on pointers or references to
polymorphic types---otherwise, it only allows casting up
(Derived* to Base*), where it has exactly the same semantics
as static_cast. On pointers to polymorphic types, it allows
arbitrary navigation within the hierarchy, including
sideways. It verifies the type: if you dynamic_cast to
Derived*, and the pointer doesn't actually point to a
Derived*, it returns a null pointer (or raises an exception
if it is a reference cast). Except in very exceptional
cases (when the profiler says you must), you should use it
exclusively for down casting.

> > dynamic cast actually checks that the object is of that
> > type, and if it isn't, it returns a null pointer. You can
> > check the returned pointer to see if the cast was
> > successful. (With static_cast you probably just get a
> > segmentation fault.)


> ``is of that type'' means that


> dynamic_cast<T>(pointer);


> (*pointer) is declared as T or T's derived classes, right?


> This cast fails if (*pointer) is declared as T's parent
> classes or other un-related classes. Am I right?


I'm not too sure I understand. If pointer is of type Derived*,
dynamic_cast< Base* >( pointer ) always succeeds, of course,
returning a pointer to the Base sub-object of the Derived. If
pointer is of type Base*, dynamic_cast< Derived* >( pointer )
will return a null pointer if the actual object doesn't contain
an unambiguous Derived in its inheritance hierarchy, and a
pointer to the Derived if it does.

> > There are situation where downcasting may be unavoidable or
> > the path of least resistance. Thus it's good to have a tool
> > to make it safer.


> I read some past posts, some said dynamic_cast indicated flaw
> in design :)


There is no requirement here for someone to be competent before
posting. dynamic_cast is easily abused, but there are cases
where it corresponds to the best design, and there are cases
where it represents the best engineering compromize.

Having a string of dynamic_cast usually is a sign of poor
design.

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientÚe objet/
Beratung in objektorientierter Datenverarbeitung
9 place SÚmard, 78210 St.-Cyr-l'╔cole, France, +33 (0)1 30 23 00 34



All times are GMT. The time now is 07:32 PM.

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