/*---------------------------------------------------------------------------* Project: NintendoWare File: main.cpp Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 13145 $ *---------------------------------------------------------------------------*/ //------------------------------------------------------------------ // デモ: RuntimeTypeInfo // // 概要 // クラスに実行時型情報を埋め込み安全なダウンキャストをおこなうサンプルです。 // Baseクラスのポインタが指しているAAAクラス、BBBクラス、CCC_AAAクラスの // オブジェクトへのインスタンスを安全に派生クラスにキャストします。 // // シリアル経由でのデバッグ出力のみのサンプルです。 // //------------------------------------------------------------------ #include #include #include // クラスBase class Base { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm Base\n"); } }; // クラスAAA class AAA : public Base { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm AAA\n"); } void FuncAAA() { OS_Printf("do FuncAAA\n"); } }; // クラスBBB class BBB : public Base { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm BBB\n"); } void FuncBBB() { OS_Printf("do FuncBBB\n"); } }; // クラスCCC class CCC_AAA : public AAA { public: NW_UT_RUNTIME_TYPEINFO; virtual void Print() { OS_Printf("I'm CCC\n"); } void FuncCCC() { OS_Printf("do FuncCCC\n"); } }; // 実行時型情報の実体を定義します。 NW_UT_RUNTIME_TYPEINFO_ROOT_DEFINITION( Base ); NW_UT_RUNTIME_TYPEINFO_DEFINITION( AAA, Base ); NW_UT_RUNTIME_TYPEINFO_DEFINITION( BBB, Base ); NW_UT_RUNTIME_TYPEINFO_DEFINITION( CCC_AAA, AAA ); /*---------------------------------------------------------------------------* Name: ObjTest Description: オブジェクトのダウンキャストのテスト関数。 クラスAAA, BBB, CCC_AAAへのダウンキャストを試みて キャストに成功した場合には派生クラスのメソッドを実行します。 Arguments: obj Baseの派生オブジェクトへのポインタ Returns: None. *---------------------------------------------------------------------------*/ static void ObjTest( Base* obj ) { AAA* pAAA; BBB* pBBB; CCC_AAA* pCCC; OS_Printf("-----------------------------\n"); obj->Print(); // クラスAAAにキャスト pAAA = nw::ut::DynamicCast( obj ); if ( pAAA ) { pAAA->FuncAAA(); } else { OS_Printf("Can't cast to AAA\n"); } // クラスBBBにキャスト pBBB = nw::ut::DynamicCast( obj ); if ( pBBB ) { pBBB->FuncBBB(); } else { OS_Printf("Can't cast to BBB\n"); } // クラスCCC_AAAにキャスト pCCC = nw::ut::DynamicCast( obj ); if ( pCCC ) { pCCC->FuncCCC(); } else { OS_Printf("Can't cast to CCC\n"); } } /*---------------------------------------------------------------------------* Name: main Description: サンプルのメイン関数です。 Arguments: なし。 Returns: なし。 *---------------------------------------------------------------------------*/ void nnMain( void ) { OS_Init(); Base obj1; AAA obj2; BBB obj3; CCC_AAA obj4; ObjTest( &obj1 ); ObjTest( &obj2 ); ObjTest( &obj3 ); ObjTest( &obj4 ); OS_Exit(0); }