c++ - 为什么我继承的接口(interface)不使用我的基类的覆盖?

标签 c++ interface multiple-inheritance

我对接口(interface)和多重继承有疑问。我希望设计我的程序,以便一个更新调用处理各种对象,每个行为“构建 block ”都隐藏在一个函数中。

例如,我想将一个生物从一个地方的 A 点移动到 B 点,而不管它是否必须执行移动前/移动后 Action 。但是,我的多重继承方案失败了(下面,修复了错误),让我觉得我需要在某处复制代码。

显然我还不够了解这一点! (但我正在努力学习它)

Q1。为什么 IPhysics::Move 不能在 CreatureAirborne 类中“看到”Creature::Move()?

Q2。我是否完全错过了接口(interface)和/或多重继承的正确用法?如果是这样,我们将不胜感激!

#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 实例。移动,这是在 Creature 分支上实现的抽象,但在 IPhysicsFlight 上仍然是抽象的。

您可以通过在某处使用虚拟继承或通过在后代中实现 Move(比如只调用它存在的父版本)来解决这种情况。

关于c++ - 为什么我继承的接口(interface)不使用我的基类的覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17201799/

相关文章:

c++ - 我怎样才能从它的多重继承基础中获得一个类地址?

c++ - 如何成功跳出这个 do-while 循环?

c++ - 初学者的 opengl 多纹理

C++:C++ 类的共同祖先和接口(interface)/原型(prototype)是否相互排斥?

java - 将多个 Java 方法转换为非阻塞线程运行?

c++ - 如何在多重继承中使用抽象方法

c++ - 阶梯式 C++ 虚拟继承

c++ - 将像素格式从 CVPixelBuffer 映射到它们的等效 V4L

Go接口(interface)方法返回接口(interface)与返回具体类型的方法不匹配

c# - 混淆多接口(interface)实现