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吗?
标准中哪些相关段落阻止上述编译?
因为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不能做到这一点.
对的成员的访问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::*()。
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |