【问题标题】:Pointer to derivate class member function from pointer to base class member function从指向基类成员函数的指针指向派生类成员函数
【发布时间】: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::fB 类的成员,但允许此分配的具体规则是什么?我对此有点困惑。编译器是否检查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


【解决方案1】:

使ptr 的初始化格式良好的标准语句是

[conv.mem]/2 类型为“指向cv T 的成员的指针”的纯右值,其中B 是类类型,可以转换为“指向D 的成员的指针”类型的纯右值类型为cv T”,其中D 是从B 派生的完整类([class.derived])...

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2017-12-27
    • 2017-07-18
    • 2017-07-27
    • 2013-06-06
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多