无法解析/理解“重写虚拟函数”,只能通过调用约定来区分
本文关键字:调用 约定 理解 函数 虚拟 重写 | 更新日期: 2023-09-27 18:04:17
我目前有一个悬而未决的问题开放-然而,在工作之后,我遇到了一个新的问题,我在试图构建它时得到的错误是:
Error 1 error C2695: 'MyEventsSink::OnSomethingHappened': overriding virtual function differs from 'Library::IEventsSink::OnSomethingHappened' only by calling convention
Error 2 error C2695: 'MyEventsSink::SomeTest': overriding virtual function differs from 'Library::IEventsSink::SomeTest' only by calling convention
我试着看这个错误,但我不能弄清楚。
这就是我正在做的,我有一个托管的c# dll类库,它正在被本地c++应用程序使用。c#接口的代码如下,该接口是用c++实现的。
c#代码是[ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid("fdb9e334-fae4-4ff5-ab16-d874a910ec3c")]
public class IEventsSinkImpl : IEventsSink
{
public void OnSomethingHappened()
{
//Doesnt matter what goes on here - atleast for now
}
public void SomeTest(IEventsSink snk)
{
//When this is called - it will call the C++ code
snk.OnSomethingHappened();
}
}//end method
,其c++实现代码为
class MyEventsSink : public Library::IEventsSink
{
public:
MyEventsSink() {}
~MyEventsSink() {}
virtual HRESULT OnSomethingHappened()
{
std::cout << "Incredible - it worked";
}
virtual HRESULT SomeTest(IEventsSink* snk)
{
//Doesnt matter this wont be called
}
};
显然在构建过程中VS2010抱怨上述错误。对于如何解决这些错误,有什么建议吗?
尝试使用__stdcall
调用约定:
virtual HRESULT __stdcall OnSomethingHappened()
通常,c++使用__cdecl
调用约定,调用者在调用后从堆栈中删除参数。包括COM在内的大多数Windows API函数都使用__stdcall
,其中被调用者从堆栈中删除参数。
显然,当您重写虚函数时,两个函数的调用约定必须相同,因为函数调用是在运行时解析的。