DOCUMENT:Q192099 27-JUL-2001 [visualc] TITLE :FIX: STATIC_DOWNCAST and DYNAMIC_DOWNCAST PRODUCT :Microsoft C Compiler PROD/VER:winnt:4.0,5.0 OPER/SYS: KEYWORDS:kberrmsg kbdocerr kbLangCPP kbMFC kbDocs kbVC400bug kbVC500bug kbVC600fix kbBug kbGrpDS ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual C++, version 4.0 - Microsoft Visual C++, 32-bit Enterprise Edition, version 5.0 - Microsoft Visual C++, 32-bit Professional Edition, version 5.0 ------------------------------------------------------------------------------- SYMPTOMS ======== The following provides supplemental information to the documentation on STATIC_DOWNCAST: STATIC_DOWNCAST( class_name, pobject ) Parameters: class_name The name of the class you want to cast to. pobject The pointer to be cast to a pointer to a class_name object. Remarks: This macro casts pobject to a pointer to a class_name object. 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 and if it points to an object that is not a "kind of" the class_name (see definition for the CObject::IsKindOf). In non- _DEBUG builds, the macro performs the cast without any type checking. class_name must be derived from CObject and use the DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC, the DECLARE_DYNCREATE and IMPLEMENT_DYNCREATE, or the DECLARE_SERIAL and IMPLEMENT_SERIAL macros explained in the Help topic "CObject Class: Deriving a Class from Cobject." For example, you might cast a pointer to CYourDocument, called pYourDoc, to a pointer to CDocument using the following expression: CDocument* pDoc = STATIC_DOWNCAST(CDocument, pYourDoc); If pYourDoc does not point to an object derived directly or indirectly from CDocument, the macro will ASSERT. Similarly, the documentation on DYNAMIC_DOWNCAST should be supplemented by saying that class_name must be derived from CObject and use the DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC, the DECLARE_DYNCREATE and IMPLEMENT_DYNCREATE, or the DECLARE_SERIAL and IMPLEMENT_SERIAL macros. If you leave out the pair of DECLARE_... and IMPLEMENT_... macros from your code, trying to cast the class pointer using STATIC_DOWNCAST or DYNAMIC_DOWNCAST gives compiler errors like the following: error C2039: 'classCMyClass' : is not a member of 'CMyClass' error C2065: 'classCMyClass' : undeclared identifier STATUS ====== MORE INFORMATION ================ Following is additional information on related subjects: 1. The documentation on CObject::IsKindOf should also include: This function works only for classes declared with the DECLARE_DYNAMIC, DECLARE_DYNCREATE, or DECLARE_SERIAL macros. 2. The documentation on DECLARE_DYNCREATE should also include: The DECLARE_DYNCREATE macro includes all the functionality of DECLARE_DYNAMIC. 3. You may also want to see the topics on the static_cast and dynamic_cast operators in the Visual C++ documentation. Please note that the STATIC_DOWNCAST and DYNAMIC_DOWNCAST macros suggest an action that is contrary to the common usage of the term "downcast". The term "downcast" is commonly used to signify the movement of an object down a class hierarchy, from a given class to a class derived from it. This may be confusing when you consider that the STATIC_DOWNCAST and DYNAMIC_DOWNCAST macros perform the action of "upcasting". The term "upcast" is commonly used to signify the movement of an object up the class hierarchy, from a derived class to a class it is derived from. REFERENCES ========== Q151070 FIX: DYNAMIC_DOWNCAST & STATIC_DOWNCAST Causes Stack Overflow Additional query words: DECLARE_DYNAMIC IMPLEMENT_DYNAMIC DECLARE_DYNCREATE IMPLEMENT_DYNCREATE DECLARE_SERIAL IMPLEMENT_SERIAL IsKindOf ====================================================================== Keywords : kberrmsg kbdocerr kbLangCPP kbMFC kbDocs kbVC400bug kbVC500bug kbVC600fix kbBug kbGrpDSMFCATL kbISS Technology : kbVCsearch kbVC400 kbAudDeveloper kbVC500 kbVC32bitSearch kbVC500Search Version : winnt:4.0,5.0 Issue type : kbbug Solution Type : kbfix ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2001.