繁体   English   中英

指向无法访问的基础中的成员函数的指针

[英]Pointer to a member function in an inaccessible base

下一个例子的汇编:

class A
{
  public:
    void foo()
    {
    }
};

class B : private A
{
  public:
    using A::foo;
};

int main()
{
    typedef void (B::*mf)();
    mf func = &B::foo;

    B b;
    (b.*func)();
}

失败并出现以下错误:

main.cpp||In function ‘int main()’:  
main.cpp|18|error: ‘A’ is an inaccessible base of ‘B’  
main.cpp|18|error:    in pointer to member function conversion

我知道A不是B的可访问基础,但我使用的是using关键字。 它不应该允许访问函数foo吗?

标准中哪些相关段落阻止上述编译?

由于B foo是从A继承A ,因此&B::foo&A::foo相同,并且类型为void (A::*)() 当你写作

typedef void (B::*mf)();
mf func = &B::foo;

您正在尝试从void (A::*)()void (B::*)() 由于BA私下继承,你不能这样做。

到的成员访问A由第11章“会员访问控制”的约束,但指针到构件转换由4.11覆盖。 特别是,4.11 / 2表示如果无法将B*转换为B* ,则无法将TA::*转换为TB::* A*

这是问题的一个小变化:

class A
{
  public:
    void foo()
    {
    }
};

class B : private A
{
  public:
    using A::foo;
};

int main()
{
    typedef void (A::*amf)();
    typedef void (B::*bmf)();
    amf func = &A::foo;
    bmf f2 = static_cast<bmf>(func);
}

我们还在谈论相同的功能。 这不是B::foo的名称查找失败( using照顾它),事实是B::foo的类型是void A::*() ,它不能转换为void B::*()

我简化了问题。 主要问题如下:

int main() 
{ 
    &B::foo; 
}

在这里,我试图访问在A类中定义并私有继承的foo的地址。 因此它给出了编译错误。

仅使用导入功能。 它不会更改foo的访问说明符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM