まず第一に、この割り当ての安全性に関する以前の投稿者からのほとんどの懸念に同意します。
そうは言っても、そのルートに進む必要がある場合は、1 レベルの間接化といくつかのタイプ セーフ チェッカーを追加します。
static const int struct_a_id = 1;
static const int struct_b_id = 2;
struct MyStructPtr {
int type;
union {
A* ptra;
B* ptrb;
//continue if you have more types.
}
};
アイデアは、「型」情報を含む構造体を介してポインターを渡すことで、ポインターを管理することです。クラス ツリーを記述する側にクラスのツリーを作成し (安全にキャストするための制限があるため、これはツリーを使用して表すことができることに注意してください)、質問に答えて、構造が正しく上下にキャストされていることを確認できます。したがって、「useLikeB」関数は次のように記述できます。
MyStructPtr the_ptr;
void init_ptr(A* pa)
{
the_ptr.type = struct_a_id
the_ptr.ptra = pa;
}
void useLikeB(){
//This function should FAIL IF aaa CANT BE SAFELY CASTED TO B
//by checking in your type tree that the a type is below the
//a type (not necesarily a direct children).
assert( is_castable_to(the_ptr.type,struct_b_id ) );
printf("B.b = %d", the_ptr.ptrb->b);
}
私の2セント。