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

More simple way to access derived properties & methods given base pointer

现在,我有这段代码,它按预期工作。为了在给定基本类型 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 中,不存在于 Defense 中。我有 6 种不同类型的 类,它们来自 Defense,它们具有自己的额外属性,Cannon 就是其中之一。

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

可以在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

中添加太多的方法