c – 为什么dynamic_cast是邪恶的?在这种情况下我应该使用dynamic_cast吗?

有人说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的成员.

上一篇:获取对象名


下一篇:c – RTTI与例外之间是否存在关联?