[英]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::*)()
。 由于B
从A
私下继承,你不能这样做。
到的成员访问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.