钻石问题与虚函数实现

时间:2014-11-03 12:33:06

标签: c++ diamond-problem

如果是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()?

5 个答案:

答案 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)

中间级别的虚拟继承只是确保基类在最后一级不包括两次,但是,因为任何个人Der1Der2都有自己的display(),编译器将两个函数成员添加到Mix。如果您未在displayDer1中重新定义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()
};