访问派生属性的更简单方法&给定基指针

时间:2016-12-09 22:21:11

标签: c++ pointers derived-class

现在,我有这个代码,它按预期工作。为了在给定基类型Defense *时设置对象类型Cannon的属性,我正在向它投射Cannon *并使用它来设置属性。

void fillProperties(Defense* defense)
{
    if (defense->getType() == "Cannon")
    {
        Cannon* c = (Cannon*)defense;
        double cannonBallDamage, cannonBallSpeed, blastRadius;

        cout << "Cannon ball damage (hp): ";
        cin >> cannonBallDamage;
        cout << "Cannon ball speed (ft/sec): ";
        cin >> cannonBallSpeed;
        cout << "Blast radius (ft): ";
        cin >> blastRadius;

        c->setBlastRadius(blastRadius);
        c->setCannonBallDamage(cannonBallDamage);
        c->setCannonBallSpeed(cannonBallSpeed);
    }
}

setBlastRadiussetCannonBallDamagesetCannonBallSpeed方法仅存在于Cannon内,而不存在于防御中。我有6种不同类型的类,它们来自于具有自己额外属性的防御,Cannon是其中之一。

我的问题是:有没有比检查对象类型更简单的方法,并为每个对象创建一个新的(已铸造)指针来设置其属性?

1 个答案:

答案 0 :(得分:1)

您可以在Defense中添加虚拟方法:

class Defense
{
public:
    virtual ~Defense()
    virtual void fillProperties() = 0;
    // [...]
};

class Canon : public Defense
{
public:
    virtual void fillProperties() override
    {
        cout << "Cannon ball damage (hp): ";
        cin >> this->cannonBallDamage;
        cout << "Cannon ball speed (ft/sec): ";
        cin >> this->cannonBallSpeed;
        cout << "Blast radius (ft): ";
        cin >> this->blastRadius;
    }
    // [...]

private:
    double cannonBallDamage, cannonBallSpeed, blastRadius;
};

Visitor pattern可用于避免在Defense

中添加太多方法