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“问题涉及指向成员函数的指针转换而非可访问性”这是什么意思?