【发布时间】:2013-06-16 14:39:43
【问题描述】:
我遇到了接口和多重继承的问题。我希望设计我的程序,以便一个更新调用处理各种对象,每个行为“构建块”都隐藏在一个函数中。
例如,我想将一个生物从 A 点移动到 B 点,无论它是否必须执行移动前/移动后操作。但是,我的多重继承方案失败了(下面,有错误 rem'd),让我觉得我需要在某个地方复制代码。
显然我对此理解得不够好! (但我正在努力学习)
第一季度。为什么 IPhysics::Move 不能在 CreatureAirborne 类中“看到”Creature::Move()?
第二季度。我是否完全错过了接口和/或多重继承的正确使用?如果是这样,任何指导表示赞赏!
#include <deque>
#include <memory>
class IGameObject
{
public:
virtual ~IGameObject() {}
virtual void Update() = 0;
};
class IPhysics
{
public:
virtual ~IPhysics() {}
virtual void Move() = 0;
};
class IPhysicsFlight : public IPhysics
{
public:
virtual ~IPhysicsFlight() {}
virtual void Land() = 0;
virtual void TakeOff() = 0;
};
class Creature : public IGameObject, IPhysics
{
protected:
virtual void Move() {}
public:
Creature() {}
virtual ~Creature() {}
virtual void Update() {}
};
class CreatureAirborne : public Creature, IPhysicsFlight
{
private:
virtual void Land() {}
virtual void TakeOff() {}
public:
CreatureAirborne() {}
virtual ~CreatureAirborne() {}
virtual void Update();
};
void CreatureAirborne::Update()
{
TakeOff();
Creature::Move();
Land();
}
int main()
{
std::deque<std::shared_ptr<Creature>> creatures;
std::shared_ptr<Creature> cow(new Creature);
creatures.push_back(cow);
// The butterfly fails to compile with 'cannot instantiate; void IPhysics::Move(void) is abstract'
// std::shared_ptr<CreatureAirborne> butterfly(new CreatureAirborne);
// creatures.push_back(butterfly);
for (auto i : creatures)
{
i->Update();
}
}
【问题讨论】:
-
为什么 Move 在 Creature 中是 protected 而在 IPhysics 中是 public?我担心这会引起一些问题,因为我认为您无法限制可见性,因此编译器可能会认为您定义了另一个函数。不确定,不是 C++ 大师。 :)
-
@MarkRansom:你说得对,我被 C#/Java/所有其他语言愚弄了... :)
-
嗯...为什么要这样?显然,空中的生物不能像非空中的生物那样移动……;)
-
您知道
class Creature : public IGameObject, IPhysics中IPhysics的继承是私有的吗?
标签: c++ interface multiple-inheritance