Re: Casting to a derived class
On Tue, 30 Jun 2009 17:52:21 CST, PGK <graham.keir@gmail.com> wrote:
Is it safe to cast from a base class pointer to a derived one?
It can be depending on what you are trying to do.
... when I compile the code below I get no warnings.
struct base {
int b;
};
struct der : public base {
int d;
};
int main(int argc, char *argv[]) {
der *pd = (der *)new base();
pd->d = 123;
}
The old C-style casts are equivalent to static_cast ... the compiler
takes your word for the safety of the operation and trusts that you
know what you are doing.
Typically one doesn't just substitute objects like in your example.
Instead you use a base class pointer to represent any possible object
of the classes in the hierarchy. Normally you'd design the hierarchy
using virtual functions so polymorphic behavior can be invoked without
knowing the actual runtime type of the object.
The proper way to do downcasting is to turn on RTTI and use
dynamic_cast<>(). dynamic_cast<>() verifies that the actual runtime
object really is of the specified class. If called with a pointer
specification, it will return a new, class specific, pointer to the
object if successful or NULL if the object is not of the specified
type.
The way you use dynamic_cast<>() for safe pointer downcasting is
something like the following:
void main(int argc, char *argv[])
{
base *pb = new der();
der *pd = dynamic_cast<der*>(pb);
if ( pd )
pd->d = 123;
else
// pd == null. cast failed - object not a 'der'
:
}
You can also use dynamic_cast<>() to make new downcast references. In
that case it throws a bad_cast exception because a legal object
reference cannot be NULL.
void main(int argc, char *argv[])
{
base *pb = new der();
try {
der &rd = dynamic_cast<der>(*pb);
rd.d = 123;
}
catch ( bad_cast )
{
// cast failed - object not a 'der'
:
}
}
George
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]