如果是c ++中的菱形问题,如果Base和中级类已经实现了虚函数。如何删除给定的错误?
#include <iostream>
using namespace std;
class Base
{
public:
virtual void display()
{
cout<<"In Base"<<endl;
}
};
class Der1:virtual public Base
{
public:
void display()
{
cout<<"In Der1"<<endl;
}
};
class Der2:virtual public Base
{
public:
void display()
{
cout<<"In Der2"<<endl;
}
};
class Mix: public Der1, public Der2
{
};
int main()
{
cout << "Hello World!" << endl;
Mix m_mix;
m_mix.display();
return 0;
}
我收到以下错误: -
main.cpp:50:错误:成员'display'的请求不明确 m_mix.display();
如何使用Mix类的对象访问Der1和Der2的display()?
答案 0 :(得分:1)
为了解决歧义,可以明确指定函数,例如:
m_mix.Der1::display();
答案 1 :(得分:1)
首先,代码中没有virtual
个函数。但是如果有的话也没关系。 (更新:想到它,如果display()
是虚拟然后Mix
,因为一个类无法编译,因为你在vtable中放了哪个函数?你会在没有调用display()
的情况下得到错误。
当您致电Mix::display()
时,有两种选择:Der1::display()
和Der2::display()
。编译器不可能区分它们,因此它不是试图猜测你想要的东西,而是告诉你它不能。所以你必须明确:
m_mix.Der1::display();
或
static_cast<Der1&>(m_mix).display();
或编写一个Mix::display()
函数来完成你想做的任何事情。
答案 2 :(得分:0)
这样打电话: -
m_mix.Der1::display ();
OR
m_mix.Der2::display ();
答案 3 :(得分:0)
中间级别的虚拟继承只是确保基类在最后一级不包括两次,但是,因为任何个人Der1
和Der2
都有自己的display()
,编译器将两个函数成员添加到Mix
。如果您未在display
和Der1
中重新定义Der2
,那么您的示例将有效。它与virtual
的{{1}}无关。例如,此代码按预期工作:
display()
答案 4 :(得分:0)
我在你的代码中发现了另一个错误:class Mix Error:覆盖虚函数&#34; Base :: display&#34;很暧昧。这是因为在您的基类 void display()是虚拟的。
class Base
{
public:
virtual void display()
{
cout<<"In Base"<<endl;
}
};
因此,在类Mix中应该有一个void display()的实现。
class Mix: public Der1, public Der2
{
// need to implement void display()
};