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

时间:2016-06-03 05:34:55

标签: 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 );
    }

2 个答案:

答案 0 :(得分:5)

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

  

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

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

所以你的问题的答案实际上是正面的 - 你被允许施放但仅此而已。

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

答案 1 :(得分:5)

参见5.2.10/6 [expr.reinterpret.cast]:

  

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

那就是说,注意作为一个例子,C ++允许你取消引用空指针,所以可能允许不是正确的术语。
以下命令也编译:

reinterpret_cast<void(*)(A*, int)>(f)( &b, 42 );

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

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