有一个基类A,这是虚拟的dynamic_cast:应在这种情况下
class A
{
~virtual A() = 0;
};
更派生类B,C,d,E代替...
class B : public A
{
};
class C: public A
{
};
和类似其他入级d,E ......我们有一个指针
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)其它属性
一些aditional的属性,例如一个对象ID impelemented;
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)是否有任何优先解决方案(可能会有所不同)?
感谢您的帮助。
我想,你可以在这里实现[访问者模式](http://en.wikipedia.org/wiki/Visitor_pattern) – Lol4t0 2012-08-14 20:08:54