首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多重继承不明确

C++多重继承不明确
EN

Stack Overflow用户
提问于 2015-07-29 17:11:55
回答 3查看 448关注 0票数 5

我在C++多重继承中遇到了一个问题。这是我的代码,当我调用display()函数时,它给我的成员‘display’是模棱两可的。但是Class M display()函数是私有的。

代码语言:javascript
复制
#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;
}

有没有人能说出这个问题的确切原因?

EN

回答 3

Stack Overflow用户

发布于 2015-07-29 17:30:42

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

代码语言:javascript
复制
class P: public M, public N
{
public:
    using N::display;
};

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

票数 4
EN

Stack Overflow用户

发布于 2015-07-29 17:19:29

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

代码语言:javascript
复制
//define function pointer
void (N::*pfn)() = &N::display;
//call function using pointer
(ob->*pfn)();
票数 1
EN

Stack Overflow用户

发布于 2015-07-29 17:17:27

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

代码语言:javascript
复制
obj.a :: abc();

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31696067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档