c++ - 没有函数指针参数的隐式向上转换?

标签 c++ function pointers contravariance upcasting

这是我遇到的一种奇怪的情况。我期望指针隐式向上转换:

struct BaseClass
{};

struct DerivedClass : BaseClass
{};

void baseClassArgFunc(BaseClass* arg) {}            // Function taking BaseClass argument
void derivedClassArgFunc(DerivedClass* arg) {}      // Function taking DerivedClass argument

int main()
{
    void (*pBaseFuncArg) (BaseClass*);      // Pointer to function taking BaseClass argument
    void (*pDerivedFuncArg) (DerivedClass*);    // Pointer to function taking DerivedClass argument

    pBaseFuncArg = baseClassArgFunc;            // Assign pointer, works fine
    pDerivedFuncArg = derivedClassArgFunc;      // Assign pointer, works fine

    pBaseFuncArg = derivedClassArgFunc;         // A value of type void (*) (DerivedClass *arg) cannot be 
                                                // assigned to an entity of type void (*) (BaseClass *)

    pDerivedFuncArg = baseClassArgFunc;         // A value of type void (*) (BaseClass *arg) cannot be 
                                                // assigned to an entity of type void (*) (DerivedClass *)

    return 0;
}

我希望将 void ( * ) (DerivedClass*) 分配给 void baseClassArgFunc(BaseClass* arg) 是安全的。我很困惑。我猜函数指针参数没有隐式向上转换?

最佳答案

更改您的类以暴露问题:

struct BaseClass
{
};

struct DerivedClass : BaseClass
{
    int a;
};

然后

pBaseFuncArg = derivedClassArgFunc;

不安全:

 void derivedClassArgFunc(DerivedClass* arg) { arg->a = 42; }


 int main()
 {
     void (*pBaseFuncArg) (BaseClass*) = derivedClassArgFunc;
     BaseClass base;

     //derivedClassArgFunc(&base); // Doesn't compile as expected
     pBaseFuncArg(&base);          // Would be UB, base->i won't exist
 }

关于c++ - 没有函数指针参数的隐式向上转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45391606/

相关文章:

C++函数在endl(内存变量?)之后打印不需要的数字

python - 简单功能不起作用,看不到错误

具有变量且参数​​数量未知的 C++ 函数

c++ - 指针与 const 和重载的交互

c - 如何将 int 指针转换为数组

c - 指向指针的指针和指向二维数组的指针之间的区别

c# - c# 中的 char[] 数组等价物

c++ - 使用 C++ TransmitFile 和重叠 I/O 的 TCP winsock 文件上传

c++ - 在派生类型中使用可分配的目标变量

c++ - 函数没有返回正确的结果