有一个基类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 案例
将 a 重铸为派生类型。
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 是 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)是否有任何优选的解决方案(可能与提出的不同)?
谢谢你的帮助。