Type Casting of MFC Class Objects

 

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at Type Casting of MFC Class Objects.

Type casting macros provide a way to cast a given pointer to a pointer that points to an object of specific class, with or without checking that the cast is legal.

The following table lists the MFC type casting macros.

Macros That Cast Pointers to MFC Class Objects

DYNAMIC_DOWNCAST Casts a pointer to a pointer to a class object while checking to see if the cast is legal.
STATIC_DOWNCAST Casts a pointer to an object from one class to a pointer of a related type. In a debug build, causes an ASSERT if the object is not a "kind of" the target type.

DYNAMIC_DOWNCAST

Provides a handy way to cast a pointer to a pointer to a class object while checking to see if the cast is legal.

DYNAMIC_DOWNCAST(class, pointer)  

Parameters

class
The name of a class.

pointer
A pointer to be cast to a pointer to an object of type class.

Remarks

The macro will cast the pointer parameter to a pointer to an object of the class parameter's type.

If the object referenced by the pointer is a "kind of" the identified class, the macro returns the appropriate pointer. If it is not a legal cast, the macro returns NULL.

STATIC_DOWNCAST

Casts pobject to a pointer to a class_name object.

STATIC_DOWNCAST
(class_name, pobject)   

Parameters

class_name
The name of the class being cast to.

pobject
The pointer to be cast to a pointer to a class_name object.

Remarks

pobject must either be NULL, or point to an object of a class which is derived directly, or indirectly, from class_name. In builds of your application with the _DEBUG preprocessor symbol defined, the macro will ASSERT if pobject is not NULL, or if it points to an object that is not a "kind of" the class specified in the class_name parameter (see CObject::IsKindOf). In non- _DEBUG builds, the macro performs the cast without any type checking.

The class specified in the class_name parameter must be derived from CObject and must use the DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC, the DECLARE_DYNCREATE and IMPLEMENT_DYNCREATE, or the DECLARE_SERIAL and IMPLEMENT_SERIAL macros as explained in the article CObject Class: Deriving a Class from CObject.

For example, you might cast a pointer to CMyDoc, called pMyDoc, to a pointer to CDocument using this expression:

   CDocument* pDoc = STATIC_DOWNCAST(CDocument, pMyDoc);

If pMyDoc does not point to an object derived directly or indirectly from CDocument, the macro will ASSERT.

See Also

Macros and Globals