在抽象类中克服钻石含糊不清
问题描述:
我写了一段代码,其中有一个抽象基类。 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;
}
答
由于您有2个方法具有相同的定义,编译器不知道使用哪个方法。你可以明确地告诉编译器使用哪个。例如,这使用从Tiger
定义:
lig.Tiger::walk();
不幸的是,给定的程序仍在畸形:
你根本不允许有一种情况,即虚拟 函数有不止一个最终在您的程序中存在 的任何派生类中的覆盖。
从this answer对于类似的问题。
或者,您可以在Liger
类中为walk()
提供一个定义,该类还允许您调用派生函数中的任意一个。这里给出的示例修改为使用此工作:
+0
既然你有一个实际的'Liger','liger.walk()'[will complie](http://coliru.stacked-crooked.com/a/13f83616bc7e032d) – NathanOliver
您从未为'Liger'定义'walk'函数。 – NathanOliver