【问题标题】:More simple way to access derived properties & methods given base pointer给定基指针访问派生属性和方法的更简单方法
【发布时间】:2017-04-25 11:37:45
【问题描述】:

现在,我有这段代码,它按预期工作。为了在给定基本类型 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 就是其中之一。

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

【问题讨论】:

    标签: c++ pointers derived-class


    【解决方案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中添加太多方法

    【讨论】:

    • 谢谢!我刚刚尝试了虚拟函数,它们很棒!
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2014-02-15
    相关资源
    最近更新 更多