C ++多重继承模糊

时间:2015-07-29 09:11:55

标签: c++

我在C ++多重继承方面遇到了问题。这是我的代码,当我调用display()函数时,它给了我成员`display'很暧昧。但是Class M display()函数是私有的。

#include<iostream>
#include<conio.h>
#include<stdio.h>

using namespace std;
class M
{

    void display()
    {
        cout<<"Class M"<<endl;
    }
};

class N
{
    public:
        void display()
        {
            cout<<"Class N"<<endl;
        }
};

class P:public M,public N
{

};

int main()
{

    P *ob = new P();
    ob->display();    // Why its giving me ambiguity error? Since only one copy is there right!!
    getch();
    return 0;
}

任何人都可以告诉为什么会出现这个问题吗?

4 个答案:

答案 0 :(得分:2)

正如许多人已经提到的,重载决议不包括可见性(publicprivateprotected)。假设您只想在P中看到公开版本,则应在using的公共接口中使用P声明:

class P: public M, public N
{
public:
    using N::display;
};

恕我直言,这比在每次通话中提供范围(obj->N::display())要优雅得多。

答案 1 :(得分:0)

多重继承中的歧义解决方案:可以通过使用范围解析运算符来指定成员函数所在的类,从而解决歧义:

obj.a :: abc();

此语句调用函数名abc(),它位于基类a。

答案 2 :(得分:0)

基本上在C ++中,在多重继承的情况下,派生类获取所有父项的所有方法的副本。因此,当您执行new P()时,新对象将获得两种不同的方法,名称为display()。因此存在歧义。 范围解析将帮助您。

//define function pointer
void (N::*pfn)() = &N::display;
//call function using pointer
(ob->*pfn)();

答案 3 :(得分:0)

您可以使用::运算符

解决此问题
ob->N::display(); //this calls display() from class N