【发布时间】:2019-09-15 02:29:09
【问题描述】:
编译这个程序的 C++ 规则是什么?
struct A
{ void f() {}; };
struct B : A
{};
int main()
{
void (B::*ptr)() = &A::f;
(void)ptr;
return 0;
}
我知道A::f 是B 类的成员,但允许此分配的具体规则是什么?我对此有点困惑。编译器是否检查A::f 的地址是B 的成员还是什么?
【问题讨论】:
-
A的每个成员也是B的成员。我不确定您对此代码有什么不清楚的地方。 -
因为一旦取了地址,你就不知道你在考虑什么具体的功能。打破此分配封装的示例:如果您将
f设为私有B(private: using A::f),则可以使用指针从b的实例调用f。我被这扇敞开的门弄糊涂了。 -
您也可以通过
b.A::f()或((A&)b).f()调用该函数。使用指向成员的指针不会添加任何原本不可用的功能。 -
@IgorTandetnik 是的,确实有道理。
A::f毕竟是公开的,你只需要先移动到基础子对象。
标签: c++ base-class pointer-to-member