超类中子类的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<EnemyBullet*>(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++调用方法?的主要内容,如果未能解决你的问题,请参考以下文章