在《COM技术内幕》中的例子,运行发生错误error C2259: 'CA' : cannot instantiate abstract class due to following members:         是按书上做的啊
贴出部分代码:
#include "stdafx.h"
#include <iostream>
#include "objbase.h"
#include "Iface.h"   //包含IX的定义interface IX:IUnknown{ virtual ULONG __stdcall FX()=0;};
using namespace std;
void trace(const char* msg){cout<<"Componcnt:"<<msg<<endl;}
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
    return TRUE;
}
class CA:public IX{
public:
virtual HRESULT __stdcall QueryInterface(const IID* iid,void** ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
virtual void __stdcall FX();
public:
CA():m_cRef(0){}
~CA(){trace("Destroy Self");}
private:
LONG m_cRef;
};
HRESULT __stdcall CA::QueryInterface(const IID* iid,void** ppv)
{
if(*iid==IID_IUnknown){
trace("Return pointer to IUnknown");
*ppv=static_cast<IX*>(this);
}
else if(*iid==IID_IX)
{
trace("Return pointer to IX");
*ppv=static_cast<IX*>(this);
}
else
{
trace("Interface not supported");
*ppv=NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
}
ULONG __stdcall CA::AddRef()
{
return m_cRef++;
}
ULONG __stdcall CA::Release()
{
if(--m_cRef==0)
{
delete this;
return 0;
}
return m_cRef;
}
void __stdcall CA::FX(){cout<<"FX"<<endl;}
extern "C" _declspec(dllexport) IUnknown* CreateInstance()
{
IUnknown* PI=static_cast<IX*>(new CA);             //在这里error C2259
PI->AddRef();
return PI;
}

解决方案 »

  1.   

    IUnknown的三个QueryInterface,AddRef,Release.IX的FX均实现了 没发现有别的啊
      

  2.   

    很显然,你虽然定义了AddRef,Release和QueryInterface,但是QueryInterface的函数原型是
    HRESULT QueryInterface(
      REFIID iid,                  //<<<<注意这里
      void ** ppvObject
    );你定义的函数不是基类所需要的,因此你不是实现了基类的纯虚函数,而是隐藏了基类的纯虚函数
      

  3.   

    其实错误信息说的很清楚:error C2259: 'CA' : cannot instantiate abstract class due to following members:  这个错误信息的下一行(following )就告诉你啥没定义了     
      

  4.   

    你没有IUnkown的QueryInterface,你实现的是你自己的QueryInterface