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类的任何部分实际上都将结束
出现编译错误