首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >虚函数实现的菱形问题

虚函数实现的菱形问题
EN

Stack Overflow用户
提问于 2014-11-03 20:33:06
回答 4查看 966关注 0票数 2

在c++中出现菱形问题的情况下,如果基础类和中级类实现了虚拟函数。如何删除给定的错误?

代码语言:javascript
运行
复制
#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()?

EN

回答 4

Stack Overflow用户

发布于 2014-11-03 20:35:07

要解决歧义,可以显式指定函数,例如:

代码语言:javascript
运行
复制
m_mix.Der1::display();
票数 1
EN

Stack Overflow用户

发布于 2014-11-03 20:36:11

首先,您的代码中没有virtual函数。但如果有也没关系。(更新:想想看,如果display()是虚的,那么Mix作为一个类是不会编译的,因为你会把哪个函数放在vtable中?你甚至没有调用display()就会得到一个错误)。

当您调用Mix::display()时,有两个选择:Der1::display()Der2::display()。编译器不可能区分它们,所以它不会试图猜测你想要什么,而是告诉你它不能。所以你只需要明确地说:

代码语言:javascript
运行
复制
m_mix.Der1::display();

代码语言:javascript
运行
复制
static_cast<Der1&>(m_mix).display();

或者编写一个Mix::display()函数,它可以做任何你想做的事情。

票数 1
EN

Stack Overflow用户

发布于 2014-11-03 20:40:52

像这样调用:-

代码语言:javascript
运行
复制
m_mix.Der1::display ();

代码语言:javascript
运行
复制
m_mix.Der2::display ();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26714446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档