c++多重继承有歧义
C++ multiple inheritance ambiguous
我有一个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
, private
和protected
)。假设您只希望在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()。
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 带有此指针的模板类多重继承构造函数不起作用?
- 引用如何解决多重继承中的歧义
- 如何处理同一模板多重继承中的歧义
- 消除多重继承中类成员的歧义
- 与 [] 运算符和多重继承的歧义
- 关于多重继承和歧义
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- c++多重继承有歧义
- 多重继承歧义基类