C# 为什么动态C++在C++中被认为是不好的实践?

C# 为什么动态C++在C++中被认为是不好的实践?,c#,c++,dynamic-cast,C#,C++,Dynamic Cast,我知道在这方面已经有很多问题了,但我还是不明白。例如: class Projectile { public: virtual void OnCollision(Projectile& other); private: Vector position; Vector velocity; }; class Bullet : Projectile { // We may want to execute different code based on

我知道在这方面已经有很多问题了,但我还是不明白。例如:

class Projectile
{
   public:
    virtual void OnCollision(Projectile& other);

   private:
    Vector position;
    Vector velocity;
};
class Bullet : Projectile
{
    // We may want to execute different code based on the type of projectile
    // "other" is.
    void OnCollision(Projectile& other) override;
};
class Rocket : Projectile
{
    // If other is a bullet, we might want the rocket to survive the collision,
    // otherwise if it's a rocket, we may want both to explode.
    void OnCollision(Projectile& other) override;
};
我不明白如果没有动态强制转换,这个例子怎么能完成。我们不能仅仅依赖多态接口,因为在这种情况下,它只能为我们提供关于一个对象的信息。有没有一种方法可以在没有动态施法的情况下做到这一点


另外,为什么动态强制转换在C中不被认为是糟糕的做法?它们在事件处理程序和非泛型容器中一直被使用。在C中可以做的很多事情都依赖于强制转换。

在这个特定示例中,我会添加一个受保护的方法:

protected:
   virtual int getKickassNess() = 0;

// Bullet:
   int getKickassNess() override { return 10; }
// Rocket:
   int getKickassNess() override { return 9001; }  // over 9000!

void Bullet::OnCollision(Projectile& other)
{
   if (other.getKickassNess() > this->getKickassNess())
      // wimp out and die
}

IMO子弹和火箭不应该知道彼此存在。在这种情况下,我可以想象它会导致混乱的循环包含问题。

在这个特定示例中,我会添加一个受保护的方法:

protected:
   virtual int getKickassNess() = 0;

// Bullet:
   int getKickassNess() override { return 10; }
// Rocket:
   int getKickassNess() override { return 9001; }  // over 9000!

void Bullet::OnCollision(Projectile& other)
{
   if (other.getKickassNess() > this->getKickassNess())
      // wimp out and die
}

IMO子弹和火箭不应该知道彼此存在。把这些关系的关系弄清楚,往往会让事情变得困难,在这种特殊的情况下,我可以想象它会引起混乱的循环问题。

为什么有C++标签?@ USER 24857,因为DyrimeSkyC铸造是C++,我的例子也是这样。好吧,从它的样子,我会说这是一个C唯一的问题,所以你的问题是关于两种语言的。@user2485710为什么要删除空格…?我认为可以肯定地说这是重复的,这里已经有很好的答案了,我想我可以补充的唯一的一点是,这种类型的转换需要RTTI,这在某些情况下可以被认为是一个下拉。为什么有C++标签?@ USER 24857?因为动态Cype是C++的,我的例子也是这样。好的,从它的角度来看,我会说这是一个C问题。所以你的问题是关于两种语言的。@user2485710为什么要删除空格…?我想可以肯定地说,这是一个重复,这里已经有了很好的答案,所以,我想我唯一可以补充的一点是,这种类型的转换需要RTTI,在某些情况下,这可能会被认为是一种失望。所以,我应该让对象根据其属性而不是类型进行行为?这很有道理。谢谢。那么,我应该让对象根据其属性而不是类型进行行为?这很有道理。谢谢