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

BЈо*_*вић 11 c++ member-function-pointers implicit-conversion private-inheritance

下一个例子的汇编:

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)();
}
Run Code Online (Sandbox Code Playgroud)

失败并出现以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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

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

yme*_*ett 6

因为fooin B是继承的A,&B::foo是相同的&A::foo,并且有类型void (A::*)().当你写作

typedef void (B::*mf)();
mf func = &B::foo;
Run Code Online (Sandbox Code Playgroud)

你正试图转换void (A::*)()void (B::*)().由于你B私下继承A不能做到这一点.


MSa*_*ers 3

对的成员的访问A由第 11 章“成员访问控制”管理,但指针到成员的转换由 4.11 涵盖。特别是,4.11/2 规定,当您无法将 an 转换T A::*为 aT B::*时,您也无法将 a 转换B*为 an 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);
}
Run Code Online (Sandbox Code Playgroud)

我们仍在谈论相同的功能。并不是 的名称查找B::foo失败(using解决这个问题),而是B::foois的类型void A::*()无法转换为void B::*()