9

ある人は言うthe use of dynamic_cast often means bad design and dynamic_cast can be replaced by virtual functions

  1. dynamic_castなぜ悪いデザインの使用が考慮されるのですか?
  2. 関数 name があると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ですか?

4

3 に答える 3

18

これはまさに間違った使用場所dynamic_castです。ポリモーフィズムを使用する必要があります。たとえば、各Animalクラスにはvirtual関数processが必要であり、ここでは を呼び出すだけanimal->process()です。

class Animal {
    virtual void Process() = 0;
}

class Cat : public Animal {
    void Process() { std::cout << " I am a tiny cat"; }
}

class Bear : public Animal {
    void Process() { std::cout << "I am a big bear"; }
}

void func(Animal * animal) {
    if (animal != nullptr) { animal->Process(); }
}

その他の問題。

が であるが、バグが原因で?と表示されている場合animalはどうなりますか?Doganimal_typeCat

static_cast必要な場合もあり、できれば代わりに使うdynamic_cast。動的キャストには、静的キャストにはない追加のパフォーマンス コストがあります。このためには、入ってくるタイプを知っていることを確認する必要があります。これstatic_castは、より安全ではないためです。

少なくとも、のメンバーである必要がありますanimal_typeAnimal

于 2013-08-26T08:04:40.770 に答える
0

ダウンキャストを使用する場合、dynamic_cast は適切です。これは、無関係なタイプへのダウンキャストを制限するためです。これを参照してください。

于 2013-08-26T08:13:55.300 に答える