为什么我继承的接口不使用基类的重写?
Why doesn't my inherited interface use my base class's override?
我有一个接口和多重继承的问题。我希望设计我的程序,这样一个更新调用处理各种对象,每个行为的"构建块"隐藏在一个单一的函数。
例如,我想在一个地方将一个生物从a点移动到B点,而不管它是否必须执行移动前/后动作。但是,我的多重继承方案失败了(下面是bug),这让我觉得我需要在某个地方复制代码。
显然我对这个不够了解!(但我正在努力学习)
Q1。为什么IPhysics::Move"看到"Creature::Move(),在CreatureAirborne类?
Q2。我是否完全忽略了接口和/或多重继承的正确用法?如果是这样,任何指导是感激的!
#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();
}
}
这在某种程度上必须遵循您的层次结构,但从编译器的角度来看,它的计算是正确的。
你在任何地方都没有虚拟继承,所以CreatureAirborne
从某一点上会有重复的基类。您将有两个IPhysics实例。移动,从那里是抽象的,在生物分支上实现,但在IPhysicsFlight上保持抽象。
您可以通过在某处使用虚拟继承来解决这种情况,或者通过在后代中实现Move(例如仅调用存在的父版本)。
我会用不同的眼光看问题
class CreatureAirborne : public IPhysicsFlight,Creature
当代码运行
时new CreatureAirborne ()
编译器将尝试构建IPhysicsFlight基类和Creature基类,而IPhysics是两个基类的事实并不起任何作用,而不是令人困惑。就编译器而言,IPhysicsFlight是抽象的,CreatureAirborne没有实现Move
当你执行
时,钻石问题实际上会发挥作用。(new CreatureAirborne ())->Move()
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 重写打印函数而不是覆盖基类
- 重写函数不打印基类数据
- 从基类调用重写的方法
- 我无法重写基类的方法,因为我的派生类是模板化的
- 哪个基类调用派生重写的方法?
- 如何在子类中重写时调用私有虚拟基类实现
- 在 c++ 中重写函数时如何选择基类?
- 基类能否知道派生类是否已重写虚拟方法
- 给定基类方法的编译时重写
- C ++中有没有办法让派生类重写基类静态方法
- 在派生类中重写哪个基类的虚拟析构函数
- 重写基类中的编译器宏
- 继承和重写 - 从基类调用重写子方法
- C++ - 如何使用基指针重写子类方法
- 重写模板基类中的纯虚拟函数
- 在继承时用指向派生类的指针重写指向基类的指针
- 调用重写函数并使用基类中的重载变量
- C++:从模板化基类重写函数
- 从基类重写虚方法