c++多重继承有歧义

C++ multiple inheritance ambiguous

本文关键字:歧义 多重继承 c++      更新时间:2023-10-16

我有一个c++多重继承的问题。这是我的代码,当我调用display()函数时,它给了我成员"display"的请求是模糊的。但是类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;
}

有谁能告诉我这个问题的确切原因吗?

正如许多人已经提到的,过载解析不包括可见性(public, privateprotected)。假设您只希望在P中看到公共版本,您应该在P的公共接口中使用using声明:

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

IMHO,这比必须在每个调用(obj->N::display())中提供作用域要优雅得多。

基本上在c++中,在多重继承的情况下,派生类获得所有父类的所有方法的副本。因此,当您执行new P()时,新对象获得两个不同的方法,具有相同的名称display()。因此有一种模糊性。作用域解析在这里会有所帮助。

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

多重继承中歧义的解决方法:可以使用作用域解析操作符指定成员函数所在的类来解决歧义,如下所示:

obj.a :: abc();

这个语句调用了位于基类a中的函数名abc()。