Visual c++ 错误的调用约定导致运行时错误

Visual c++ 错误的调用约定导致运行时错误,visual-c++,runtime-error,calling-convention,Visual C++,Runtime Error,Calling Convention,我有以下类定义: class IRenderable { public: virtual void Render( wxBitmap * ) = 0; } class MyClass : public wxWindow, public IRenderable { public: /* costructor, destructor etc... */ void RenderBitmap( wxBitmap *bitmap ) { // code

我有以下类定义:

class IRenderable {
 public:

    virtual void Render( wxBitmap * ) = 0;
}

class MyClass : public wxWindow, public IRenderable {

public:

/* costructor, destructor etc... */


    void RenderBitmap( wxBitmap *bitmap )
    {
        // code
    }

}
<> px> WxWrand和WxButMax是属于WxWIDGOSS库的类(用于编写GUI应用程序的C++可移植库)。 我使用的是Visual C。以下代码错误:

MyClass *c = new MyClass(...);
wxWindow *w = (wxWindow *)c;
IRenderable *r_page = (IRenderable *)w;
// bitmap is allocate somewhere else           
r_page->RenderBitmap( bitmap );
因为我得到一个运行时错误:

运行时检查失败#0-ESP的值未正确保存 跨越函数调用。这通常是调用 用一个调用约定和一个函数指针声明的函数 使用不同的调用约定声明

发生什么事了

我正在做的事情如下。第三方库(wxAUI)获取指向wxWindow的指针以对其进行管理。我对wxWindow(MyClass)进行了子封装,以添加一些特定代码。因此,我使用MyClass对象,而不是管理wxWindows对象。 在某些情况下,我要求wxAUI返回“当前”窗口的wxWindow指针,它应该是指向MyClass对象的指针。我想在这些对象上调用RenderBitmap()方法,所以我需要将其强制转换为IRenderable,但会得到运行时错误

我没有启用RTTI,现在也不知道这是否能解决问题…

问题在这里:

IRenderable *r_page = (IRenderable *)w;
w
不指向
IRenerable
实例。我知道你为什么会这么想,但事实并非如此

避免从多个类继承,谷歌“钻石继承”和“虚拟继承”可以更好地理解

摘自关于钻石问题的报告:

默认情况下,C++分别遵循每个继承路径,因此D对象 将实际包含两个单独的A对象,并使用A的成员 必须具备适当的资格。如果从A到B的继承 从A到C的继承都标记为“virtual”(例如,“class”) B:虚拟公共A“”,C++特别注意只创建一个 对象,并正确使用A的成员。如果虚拟继承 非虚拟继承是混合的,只有一个虚拟继承和 a的每个非虚拟继承路径的非虚拟a。请注意 在这种情况下,A的非虚拟推导将没有直接意义 从D类访问A类的任何部分实际上都将结束 出现编译错误