我正在研究钻石问题。我写了下面的代码。但是它显示出模棱两可的问题。怎么解决呢? 在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;
}
答案 0 :(得分:3)
这里发生的是Animal
和Reptile
都用自己的版本覆盖了LivingThing::breathe()
方法。因此,Snake
继承了两个不同的方法,都被称为breathe
,每个方法都来自其基类。当你写的时候
snake.breathe();
名称breathe
含糊不清,因为它可以引用Animal::breathe
或Reptile::breathe
。您必须明确指出应调用哪个,例如
snake.Reptile::breathe();
这很可能不是您想要的。 breathe()
不是虚拟方法。您很可能希望它是一种虚拟方法,但是在这种情况下,您绝对应该看看How does virtual inheritance solve the "diamond" (multiple inheritance) ambiguity?。