仮想の基本クラスAがあります
class A
{
~virtual A() = 0;
};
およびより派生したクラスB、C、D、E .. ..
class B : public A
{
};
class C: public A
{
};
他のクラス化されたD、Eについても同様です...Aポインタのリストがあります
std::list <A*> a_list;
たとえば、タイプが不明な要素はすべて削除します
A *a = a_list.front();
私たちが決定する先の尖ったオブジェクトのタイプに基づいて、何をすべきか...それを行う方法にはもっと多くの可能性があります:
A)dynamic_castの場合
派生型への再キャスト。
if (dynamic_cast <B*> (a))
{
//do something (but nothing with a)
}
else if (dynamic_cast <C*> (a))
{
//do other (but nothing with a)
}
ただし、dynamic_castの使用法は、設計が不適切であることを示しています。
B)追加の属性
オブジェクトIDなどの追加の属性が組み込まれています。
class A
{
virtual ~A() = 0;
virtual short getID() = 0;
};
class B : public A
{
virtual short getID() {return 1;}
};
class C: public A
{
virtual short getID() {return 2;}
};
したがって、変更された条件
switch ( a->getID())
{
case 1: // do something (but nothing with a)
case 2: // do other (but nothing with a)
}
注:
オブジェクトに対して直接アクションを実行することはありませんが、そのタイプに基づいて、いくつかの異なる計算を実行します。
質問:
1)dynamic_castを避けるべき場合はそうですか?
2)好ましい解決策はありますか(提示されたものとは異なる場合があります)?
ご協力いただきありがとうございます。