通过reinterpret_casting方法指针,将派生类的方法从指针调用到基类。这是UB吗?

时间:2019-07-08 23:13:31

标签: c++ inheritance reinterpret-cast member-pointers

通过将指向派生类型的对象的指针分配给其基类的指针,我发现您可以将方法从派生类重播到基类的指针,即使基类没有没有任何此类功能(虚拟,隐藏或其他功能)。可以从那里取消引用和调用它,并且“正常工作”。但我想确保它不是UB。这是UB吗?便携吗?

可编译示例:

#include <cstdio>

struct A { /* no foo method */ };
struct B : public A { void foo(void){printf("foo");} };

typedef void (B::*B_FOO_PTR)( void );
typedef void (A::*A_FOO_PTR)( void );

int main ( void ) {
    B b;
    A* a = &b;

    // address of a and b are identical

    B_FOO_PTR b_ptr = &B::foo;
    // (a->*b_ptr)(); // COMPILE ERROR: calling B method from A. Not Allowed, but...

    A_FOO_PTR a_ptr = reinterpret_cast<A_FOO_PTR>(b_ptr);
    (a->*a_ptr)(); // works, outputs "foo"

    return 0;
}

1 个答案:

答案 0 :(得分:4)

这是未定义的行为。可以调用结果的唯一的指针到成员的函数转换是:

  • 往返转换,和
  • 指向基础的成员的指针。

您尝试第二点的倒数,该点不包括在此列表中。