我写了一段代码,其中有一个抽象基类。 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;
}
答案 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;
}