【发布时间】:2019-12-13 10:32:51
【问题描述】:
首先抱歉,如果问题的名称不够清楚。我真的不知道如何称呼这个问题。
所以我在一个类中有一个函数指针,它像一个 java 回调一样工作,我使用一些参数调用它,比如它本身是从父类派生的,就像在这个例子中一样:
class Parent;
using f_Call = void(*)(Parent*);
class Parent
{
public:
void setCallback(f_Call call)
{
mOnCall = call;
}
protected:
f_Call mOnCall = nullptr;
};
class Child1 : Parent
{
public:
void doSomething()
{
// some work..
if (mOnCall)
mOnCall(this);
}
};
void onCallExe(Parent* p)
{
Child1* child = (Child1*)p;
// do some more work...
}
int main()
{
Child1 child;
child.setCallback(onCallExe);
child.doSomething();
}
我的问题是,c++ 是否有办法在 onCallExe 中自动进行从父级到子级的强制转换,所以我不必为我调用的每个函数都这样做。
谢谢!
【问题讨论】:
-
如果你总是想在回调中使用
Child*,为什么不相应地更改签名呢? -
嗨@dave,我的项目中有 16-18 个子类,它们最终会执行该函数。
-
在这种情况下,我认为没有自动的方法可以做到这一点。 (编译器如何知道要为任何给定的回调函数转换到哪个子类?)在我看来,您可能希望在
Parent类中添加更多虚函数,因此您根本不需要转换。 -
听到这个消息很难过。无论如何,感谢您的帮助!
-
您不想使用函数指针。你想要
std::function<void()>(是的,没有参数)并且你想要传递一个带有捕获的对象的lambda。
标签: c++ class inheritance callback