考虑Base
类和两个Child
类:
class Base
{
public:
~Base() = default;
virtual void mouseCallback() = 0; // this is overriden by the Childs!
void mouseCallback2() { std::cout << "mouseCallback2 OK" << std::endl; }//Not overriden
};
class Child1 : public Base
{
public:
~Child1() = default;
void mouseCallback() override;
};
class Child2 : public Base
{
public:
~Child2() = default;
void mouseCallback() override;
};
实施地点:
void Child1::mouseCallback()
{
std::cout << "Child 1 OK" << std::endl;
}
void Child2::mouseCallback()
{
std::cout << "Child 2 OK" << std::endl;
}
我有CameraVision
课程:
class CameraVision
{
public:
// ...
void init();
static void callback(int event, int x, int y, int flags, void* userdata);
private:
Base* mBase; // A pointer to the Base class!
}
其中包含init()
方法,如下所示:
void CameraVision::init()
{
mBase = new Child1();
// Here I set the callback
cv::setMouseCallback("Title", callback, &mBase);
}
因此当鼠标有一个事件我有这个时,overriden方法会崩溃我的应用程序。
void CameraVision::callback(int event, int x, int y, int flags, void* userdata)
{
if (event == cv::EVENT_LBUTTONDOWN)
{
Base* tof = static_cast<Base*>(userdata);
tof->mouseCallback2(); // THIS WORKS!
// But this is what I need
tof->mouseCallback(); // ERROR!!!!!!
}
}
为什么我无法使用mouseCallback()
继承Child1
?
我收到了error
:
Exception thrown at 0x000000013F391938 in Demo.exe: 0xC0000005: Access violation executing location 0x000000013F391938
我期待output
:
mouseCallback2 OK
Child 1 OK
答案 0 :(得分:2)
mBase是Base *类型,然后您不需要简单地使用&amp;
cv::setMouseCallback("Title", callback, mBase);
&amp; mBase将为您提供指向指针的指针,因此您的static_cast不会返回原始的mBase指针,但是它的地址。不确定第一个回调是如何工作的,都应该导致UB。