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

标签 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 中,不存在于 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

中添加过多的方法

关于c++ - 给定基指针访问派生属性和方法的更简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41069776/

相关文章:

c++ - 用于碰撞检测的 O(n^log n) 算法

pointers - 如何返回自定义错误而不导致 nil 值出现问题

c++ - 也许我对 [class.access]/7 的理解不正确,但是

C++:基类中的字符串参数在派生类解构时解构

c++ - `using` 基类默认行为的关键字

c++ - 如何在 WTL 中删除指向无模式对话框的指针

c++ - 扁平化为 1D 数组的 2D 和 3D 数组的等效迭代?

c++ - 错误调试断言失败

使用指针创建字符串数组

C++ 运行时错误 : free(): invalid next size (fast)