有一個基類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