超类中子类的C++调用方法?

Posted

技术标签:

【中文标题】超类中子类的C++调用方法?【英文标题】:C++ calling method of subclass in superclass? 【发布时间】:2016-08-15 21:42:31 【问题描述】:

我有一个超类 Bullet 的 EnemyBullet 子类。 现在我使用 EnemyBullet 对象调用 Bullet 方法 Process()。 我想要的是确定当前对象是否是 EnemyBullet 以区别于 Bullet 动作。 我的代码是这样的,

void Bullet::Process(float deltaTime)

// Generic position update, based upon velocity (and time).
m_y = m_y + this->GetVerticalVelocity()*deltaTime;
m_pSprite->SetY(static_cast<int>(m_y));
m_pSprite->SetX(static_cast<int>(m_x));

  if (m_y < 0)
  
    SetDead(true);
  

//Here I want to detect current object is an EnemyBullet, then define a different action
//I tried the following code, but it didn't work
if (EnemyBullet* v = static_cast<EnemyBullet*>(Bullet)) 
     if (m_y >800)
    
      SetDead(true);
    
 

【问题讨论】:

你至少想要dynamic_cast 而不是static_cast。但是为什么不直接覆盖EnemyBullet 中的方法呢? @Wilheim 还有至少一个错误:你的意思可能是..._cast&lt;EnemyBullet*&gt;(this) 基类不应该知道任何子类的存在。请改用@Tavian Barnes 的建议,并让子类覆盖相关方法。 @Wilheim 下面是你的方法的一个例子:ideone.com/fG3Ael @Wilheim:Bullet 有没有可能没有虚拟成员函数?在这种情况下,dynamic_cast 将无法正常工作。 【参考方案1】:

这是一个从超类中的方法调用子类实例上的方法的示例:

class Bullet 
public:
  void process() 
    // update m_y...

    // update sprite position...

    if (this->isDead()) 
      // handle dead bullet...
    
  

  virtual bool isDead() 
    return (m_y < 0);
  

protected:
  int m_y;
;

class EnemyBullet : public Bullet 
public:
  bool isDead() override 
    return (m_y > 800);
  
;

注意每种子弹类型如何具有自定义isDead 逻辑。

【讨论】:

以上是关于超类中子类的C++调用方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥继承在 Java 和 C++ 中的行为不同,超类调用(或不调用)子类的方法?

从超类调用子类的方法

在 Python 的超类中调用超类方法

父类中的方法被覆盖以及子类调用父类覆盖的方法

超类中的私有final可以被覆盖吗?

是否可以在 C++ 中的超类中拥有子类的成员