克服抽象课

时间:2016-08-23 17:44:12

标签: c++ inheritance virtual multiple-inheritance diamond-problem

我写了一段代码,其中有一个抽象基类。 Tiger和Class Lion几乎是从Animal Base Class继承而来。 Liger继承了Lion和Tiger。当我尝试创建Liger的对象并访问walk函数时,我得到错误“walk of walk of walk”。我使用虚拟继承来避免钻石问题。任何人都可以帮我解决这个问题。

#include "stdafx.h"
#include <iostream>
using namespace std;
class Animal
{
public:
    virtual void walk() = 0;

};
class Lion : virtual public Animal
{
public:
     void walk()
    {
        cout<<"Animal Walking"<<endl;
    }
};
class Tiger : virtual public Animal
{
public:
    void walk()
    {
        cout<<"Animal Walking"<<endl;
    }
};
class Liger : public Lion , public Tiger
{
public:

};


int _tmain(int argc, _TCHAR* argv[])
{
    Liger lig;
    lig.walk();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

由于您有两个具有相同定义的方法,因此编译器不知道使用哪个方法。您可以明确告诉编译器使用哪个。例如,它使用Tiger

中的定义
lig.Tiger::walk();

不幸的是,给定的程序仍然不正确:

  

你根本不被允许有虚拟的情况   函数在任何派生类中都有多个最终覆盖   存在于你的程序中。

来自this answer的类似问题。

或者,您可以在walk()类中提供Liger的定义,这也允许您调用任一派生函数。以下是使用此修改后的给定示例:

#include <iostream>

class Animal
{
public:
    virtual void walk() = 0;
};

class Lion : virtual public Animal
{
public:
    void walk()
    {
        std::cout << "Lion walking" << std::endl;
    }
};
class Tiger : virtual public Animal
{
public:
    void walk()
    {
        std::cout << "Tiger walking" << std::endl;
    }
};

class Liger : public Lion, public Tiger
{
public:
    void walk()
    {
        std::cout << "Liger walking" << std::endl;
    }
};


int main()
{
    Liger liger;
    liger.walk();

    // Note that you can also access other derived classes' walk functions
    liger.Tiger::walk();

    return 0;
}