多重继承的不明确解决方法?

2024-01-07

我有一个名为“动物”的基类,以及继承自“动物”的一只狗和一只猫。 还有一个名为dogcat的多重继承类,它继承自dog和cat, 在动物中我有一种称为睡眠的方法。当我想使用dogcat的该方法时,我收到错误“DogCat::sleep”不明确,我确实理解这个问题,但我在一本书中读到,当你将 sleep 声明为虚拟时,这应该是可能的 - 但它不起作用。

这不可能是书上的错误还是有任何解决方法?

class Animal
{
public:
    Animal(){}

    virtual void sleep()
    {
        cout << "zzzzzzzzz" << endl;
    }
    virtual void eat() = 0;

};

class Dog: public Animal
{
protected:
    Dog(){}

    virtual void eat() override
    {
        cout << "eats dogfood" << endl;
    } 
};

class Cat :public Animal
{
public:
    Cat(){}
    virtual void eat() override
    {
        cout << "eats catfood" << endl;
    }
};

class DogCat : public Dog, public Cat
{
public:
    DogCat(){}
    using Dog::eat;

};

int main(int argc, char** argv) {
    DogCat *DC = new DogCat();
    DC->sleep();//Error
}

你有钻石问题 https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem

“钻石问题”(有时称为“致命的死亡钻石”[4])是当两个类 B 和 C 继承自 A,而类 D 继承自 B 和 C 时出现的歧义。 A 中的方法被 B 和 C 重写了,而 D 没有重写它,那么 D 继承了该方法的哪个版本:B 的还是 C 的?

所以。现在你有两个 A 实例。解决方案是什么?你有两个:

  1. 在子类之一中定义睡眠操作并调用它:
class Cat :public Animal
{
    public:
        Cat(){}
        virtual void eat() override
        {
            cout << "eats catfood" << endl;
        }

        void sleep()
        {
            Animal::sleep();
        }
};

int main(int argc, char** argv) {
    DogCat *DC = new DogCat();
    DC->Cat::sleep();
}
  1. 使用虚拟继承,就像 @Asesh 答案所说的那样。问题出在常用方法 eat() 上。你必须覆盖它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多重继承的不明确解决方法? 的相关文章

随机推荐