Re: downcast to derived class in privately inherited base class templa
"Georg Krichel" <GeorgKrichel@discussions.microsoft.com> wrote in
message news:5A8799A9-CEDD-42C4-AA07-9F23730AA07B@microsoft.com
This unmanaged C++ code works with Visual Studio 2003 but raises "bad
dynamic cast exception" in Visual Studio 2005:
template< typename D >
class Base
{
public:
virtual ~Base( ) { ; }
void doFunc( )
{
D* dp = &dynamic_cast< D& >( *this ); // CRASH at runtime!
// ... more code using "dp"
}
};
class Derived : private Base< Derived >
{
friend class Base< Derived >;
public:
void doFunc( ) { Base< Derived >::doFunc( ); }
};
This behavior is standard-conforming. From 5.2.7 Dynamic cast:
7 ... a run-time check is applied to see if the object pointed or
referred to by v can be converted to the type pointed or referred to by
T.
8 The run-time check logically executes as follows:
- If, in the most derived object pointed (referred) to by v, v points
(refers) to a *public* base class sub-object of a T object, and if only
one object of type T is derived from the sub-object pointed (referred)
to by v, the result is a pointer (an lvalue referring) to that T object.
- Otherwise, if v points (refers) to a *public* base class sub-object of
the most derived object, and the type of the most derived object has an
unambiguous *public* base class of type T, the result is a pointer (an
lvalue referring) to the T sub-object of the most derived object.
- Otherwise, the run-time check fails.
9 The value of a failed cast to pointer type is the null pointer value
of the required result type. A failed cast to reference type throws
bad_cast (18.5.2).
Emphasis mine. So your program took advantage of a bug in VC2003 which
is fixed in VC2005
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925