如何解决钻石问题的这种歧义

时间:2019-04-02 11:09:47

标签: c++

我正在研究钻石问题。我写了下面的代码。但是它显示出模棱两可的问题。怎么解决呢? 在Snake类中没有重写方法是否可能?

    #include <iostream>
    class LivingThing {
    protected:
       void breathe()
       {
          std::cout << "I'm breathing as a living thing." << std::endl;
       }
    };

    class Animal : virtual protected LivingThing {
    protected:
       void breathe() {
          std::cout << "I'm breathing as a Animal." << std::endl;
       }
    };

    class Reptile : virtual public LivingThing {
    public:
       void breathe() {
          std::cout << "I'm breathing as a Reptile." << std::endl;
       }
    };

    class Snake : public Animal, public Reptile {

    };

    int main() {
       Snake snake;
       snake.breathe();
       getchar();
       return 0;
    }

1 个答案:

答案 0 :(得分:3)

这里发生的是AnimalReptile都用自己的版本覆盖了LivingThing::breathe()方法。因此,Snake继承了两个不同的方法,都被称为breathe,每个方法都来自其基类。当你写的时候

snake.breathe();

名称breathe含糊不清,因为它可以引用Animal::breatheReptile::breathe。您必须明确指出应调用哪个,例如

snake.Reptile::breathe();

这很可能不是您想要的。 breathe()不是虚拟方法。您很可能希望它是一种虚拟方法,但是在这种情况下,您绝对应该看看How does virtual inheritance solve the "diamond" (multiple inheritance) ambiguity?