-1

我写了一段代码,其中有一个抽象基类。 Tiger和Class Lion几乎都是从Animal Base Class继承而来的。狮子从狮子和老虎继承。当我尝试创建一个Liger对象并访问漫游功能时,出现“模糊访问步行”错误。我已经使用虚拟继承来避免钻石问题。任何人都可以帮助我解决这个问题。在抽象类中克服钻石含糊不清

#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; 
} 
+0

您从未为'Liger'定义'walk'函数。 – NathanOliver

回答

1

由于您有2个方法具有相同的定义,编译器不知道使用哪个方法。你可以明确地告诉编译器使用哪个。例如,这使用从Tiger定义:

lig.Tiger::walk(); 

不幸的是,给定的程序仍在畸形:

你根本不允许有一种情况,即虚拟 函数有不止一个最终在您的程序中存在 的任何派生类中的覆盖。

this answer对于类似的问题。

或者,您可以在Liger类中为walk()提供一个定义,该类还允许您调用派生函数中的任意一个。这里给出的示例修改为使用此工作:

​​
+0

既然你有一个实际的'Liger','liger.walk()'[will complie](http://coliru.stacked-crooked.com/a/13f83616bc7e032d) – NathanOliver