在C++中,是否允许将函数指针转换为一个函数指针,该函数指针作为参数获取指向基类或派生类的指针?

Yar*_*Tal 4 c++ pointers casting function-pointers

以下是否会按预期工作?:

struct A {};

struct B: public A {
    int x;
    };

void f( B* o ) {
    std::cout << o->x << std::endl;
    }

int main () {
    B b;
    b.x = 5;
    reinterpret_cast<void(*)(A*)>(f)( &b );
    }
Run Code Online (Sandbox Code Playgroud)

mar*_*inj 6

在强制转换后使用此类指针的未定义行为:

任何指向函数的指针都可以转换为指向不同函数类型的指针.通过指向不同函数类型的指针调用函数是未定义的,但是将此指针转换回指向原始函数类型的指针会产生指向原始函数的指针.

来自http://en.cppreference.com/w/cpp/language

所以你的问题的答案实际上是积极的 - 你被允许施放但仅此而已.

你可能会问"只有铸造的重点是什么?" - 当您想要在单个集合中存储各种功能时,这非常有用.


sky*_*ack 5

5.2.10/6 [expr.reinterpret.cast]:

函数指针可以显式转换为不同类型的函数指针.通过指向函数类型的指针调用函数的效果是未定义的,该函数类型与函数定义中使用的类型不同.

也就是说,请注意C++允许您取消引用空指针的示例,因此可能允许使用不正确的术语.
以下命令也编译:

reinterpret_cast<void(*)(A*, int)>(f)( &b, 42 );
Run Code Online (Sandbox Code Playgroud)

它和问题中的那个是允许的,无论它是否按预期工作(它主要取决于你的期望,如评论中的@ luk32所述).

您的问题的答案是肯定的,允许转换,但通过新指针调用函数会导致未定义的行为.