我在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;
}有没有人能说出这个问题的确切原因?
发布于 2015-07-29 17:30:42
正如许多人已经提到的,重载解析不包括可见性(public、private和protected)。假设您只希望公共版本在P中可见,则应该在P的公共接口中使用using声明
class P: public M, public N
{
public:
using N::display;
};我的天,这比必须在每个调用中提供作用域(obj->N::display())要优雅得多。
发布于 2015-07-29 17:19:29
基本上在C++中,在多重继承的情况下,派生类获得所有父类的所有方法的副本。因此,当您执行new P()时,新对象将获得两个不同的方法,名称相同的display()。因此有一个模棱两可的地方。作用域解析将在这里为您提供帮助。
//define function pointer
void (N::*pfn)() = &N::display;
//call function using pointer
(ob->*pfn)();发布于 2015-07-29 17:17:27
多重继承中歧义的解决:可以通过使用作用域解析运算符指定成员函数所在的类来解决歧义,如下所示:
obj.a :: abc();此语句调用位于基类a中的函数名abc()。
https://stackoverflow.com/questions/31696067
复制相似问题