现在,我有这段代码,它按预期工作。为了在给定基本类型 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);
}
}
setBlastRadius
、setCannonBallDamage
和 setCannonBallSpeed
方法仅存在于 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/