有人说the use of dynamic_cast often means bad design and dynamic_cast can be replaced by virtual functions
>为什么使用dynamic_cast认为设计不好?
>假设我有函数名func(Animal * animal,int animalType),func中的实现如下:
bool func(Animal* animal, int animalType)
{
...
/* Animal is the base class of Bear, Panda, Fish ....
dynamic_cast animal to real animals(Bear, Panda, Fish...)
according to animalType. Do some processing with this specific
type of animal, using its additional information beyond base
class Animal. */
}
这种情况是否正确使用了dynamic_cast?
解决方法:
这完全是使用dynamic_cast的错误位置.你应该使用多态.每个Animal类都应该有一个虚函数,比如,process,在这里你应该只调用animal-> process().
class Animal{
virtual void Process() = 0;
}
class Cat:public Animal{
void Process() {cout<<" I am a tiny cat";}
}
class Bear :public Animal{
void Process(){cout<<"I am a big bear";
}
void func(Animal* animal){
if(animal != NULL) animal -> Process();
}
其他问题.
什么是动物是一只狗,但由于虫子,动物类型说它是一只猫?
有时需要static_cast,如果可能的话,使用它而不是动态强制转换.动态强制转换具有静态强制转换所不具备的额外性能成本.为此,您需要确保知道正在进入的类型,因为static_cast更不安全.
附:至少,animal_type应该是Animal的成员.