Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向不可访问基中成员函数的指针_C++_Implicit Conversion_Member Function Pointers_Private Inheritance - Fatal编程技术网

C++ 指向不可访问基中成员函数的指针

C++ 指向不可访问基中成员函数的指针,c++,implicit-conversion,member-function-pointers,private-inheritance,C++,Implicit Conversion,Member Function Pointers,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)(); } 失败,出现下一个错误: main.cpp||In function ‘i

下一个示例的编译:

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的基,但我正在使用
关键字
。它不应该允许访问函数foo吗


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

由于
B
中的
foo
继承自
A
&B::foo
&A::foo
相同,并且具有类型
void(A:*)()
。当你写作时

typedef void (B::*mf)();
mf func = &B::foo;
您正在尝试从
void(A::*)()
转换为
void(B::*)()
。由于
B
A
私有继承,您不能这样做。

A
成员的访问受第11章“成员访问控制”的约束,但指向成员转换的指针在第4.11节中有所涉及。特别是,4.11/2规定,当不能将
B*
转换为
a*
时,不能将
ta:*
转换为
tb:*

这是问题的一个细微变化:

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);
}
A类
{
公众:
void foo()
{
}
};
B类:私人A
{
公众:
使用A::foo;
};
int main()
{
typedef void(A::*amf)();
typedef void(B::*bmf)();
amf func=&A::foo;
bmf f2=静态_转换(func);
}

我们仍然在讨论相同的函数。失败的不是
B::foo
的名称查找(
使用
解决了这个问题),而是
B::foo
的类型是
void A::*()
,不能转换为
void B:*()
我简化了这个问题。主要问题如下:

int main() 
{ 
    &B::foo; 
}
在这里,我试图访问foo的地址,它是在类A中定义的,并且是私有继承的。因此,它给出了编译错误


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

好问题。因为一个人可以做
b.foo()
,但不能做
&b::foo
。完全重复-。不投票结束,因为另一个问题没有被接受的答案,但似乎应该是。@eran,你去哪里了?事实上,我不得不挖掘规范,并再次引用完全相同的句子来转化异教徒!:-)更清楚地说:
void(A::*amf)(=0;无效(B::*bmf)(=amf在第二条语句中失败。我不确定是否遵循了。在我的回答中,我说B::foo用于重载解析,并且仅用于重载解析。对于任何其他用途,它都是A::foo,并且您声称因为它是A::foo,所以分配失败。现在,如果你说你的回答完成了我的任务,我会理解的。但是,如果完全相同,它又是如何100%相反的呢?@litteadv:你直截了当地宣称“你可以做b.foo,但不是&b::foo。”我证明你可以。另请参见。不管怎样,我相信用户问为什么使用
使用
无法解决问题,您似乎无法解决这个问题。您可以补充以下内容是正确的:
typedef void(A::*mf)();mf func=&B::foo
,坚持问题涉及指向成员函数的指针转换而非可访问性。@LucTouraille“问题涉及指向成员函数的指针转换而非可访问性”这是什么意思?