我在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;
}
任何人都可以告诉为什么会出现这个问题吗?
答案 0 :(得分:2)
正如许多人已经提到的,重载决议不包括可见性(public
,private
和protected
)。假设您只想在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