关于多重继承的问题(菱形继承,atl中如何把接口的相同的实现提取到基类中。。)

xiaohyy 2003-12-25 07:35:00
用atl写com时,多个类继承一个接口,这个接口中的有些方法有相同的实现

所以我决定把这些相同的实现提到一个基类中,

IA
/ \
CB1 CB2
\ /
CC

比如IA中有3个方法,a1,a2,a3;
CB1实现了方法a1,CB2实现了方法a2,CC实现了方法a3

但是这样出现一个问题,说不能实例化CC,警告提示CB2没有实现IA的a1方法

在这里CB2也是抽象基类,根本不用实例化。。。但是我最终保证CC实现了IA中的3个方法(a1时在CB1中实现的,a2是在CB2中实现的,a3是在CC中实现的)

请问这个问题如何解决???
...全文
114 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄双全 2003-12-25
  • 打赏
  • 举报
回复
class IA
{
public:
virtual void a1()=0;
virtual void a2()=0;
virtual void a3()=0;
};

class CB1:public virtual IA
{
public:
void a1(){printf("a1");}
};


class CB2:public virtual IA
{
public:
void a2(){printf("a2");}

};

class CC:public CB1,public CB2
{
public:
void a3(){printf("a3");}
};
xiaohyy 2003-12-25
  • 打赏
  • 举报
回复
晕,又说错了。。以上是atl中IDispatchImpl的源代码
xiaohyy 2003-12-25
  • 打赏
  • 举报
回复
附:以下是atl中IDispatch的源代码

template <class T, const IID* piid, const GUID* plibid = &CComModule::m_libid, WORD wMajor = 1,
WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
class ATL_NO_VTABLE IDispatchImpl : public T
{
public:
typedef tihclass _tihclass;
// IDispatch
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
{
*pctinfo = 1;
return S_OK;
}
STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
return _tih.GetTypeInfo(itinfo, lcid, pptinfo);
}
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
LCID lcid, DISPID* rgdispid)
{
return _tih.GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
}
STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
return _tih.Invoke((IDispatch*)this, dispidMember, riid, lcid,
wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
}
protected:
static _tihclass _tih;
static HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
{
return _tih.GetTI(lcid, ppInfo);
}
};
xiaohyy 2003-12-25
  • 打赏
  • 举报
回复
error:CComObject<class CC>' : cannot instantiate abstract class due to following members

warning C4259: 'long __stdcall IA::a2( )' : pure virtual function was not defined

warning C4259: 'long __stdcall IDispatch::GetTypeInfoCount(unsigned int *)' : pure virtual function was not defined
c:\program files\platform sdk\include\oaidl.h(2712) : see declaration of 'GetTypeInfoCount'

......其余几个IDispatch的接口方法不能实例化的警告
......
xiaohyy 2003-12-25
  • 打赏
  • 举报
回复
最后哪个CC错了,应该是
class ATL_NO_VTABLE CC :
public IDispatchImpl<IA, &IID_IA, &LIBID_NXPPROXYLib>,
public CB2<IA>
{
...
STDMETHOD(a3)()
{
return S_OK;
}
...
}
xiaohyy 2003-12-25
  • 打赏
  • 举报
回复
代码大概如下:CB1相当于IDispatchImpl...
[
object,
uuid(9050C1F6-615D-42f0-844D-C4578E270C9E),
dual,
pointer_default(unique)
]
interface IA : IDispatch
{
HRESULT a2();
HRESULT a3();
};


template<class T>
class ATL_NO_VTABLE CB2 :
public T
{
public:
STDMETHOD(a2)()
{
return S_OK;
}

protected:
int iii;
};

class ATL_NO_VTABLE CC :
public IDispatchImpl<IA, &IID_IA, &LIBID_NXPPROXYLib>,
public CB2<INXPSocks5ProxyCom>
{
...
STDMETHOD(a3)()
{
return S_OK;
}
...
}

xiaohyy 2003-12-25
  • 打赏
  • 举报
回复
不是,没必要用虚拟继承。。
蒋晟 2003-12-25
  • 打赏
  • 举报
回复
你派生的时候指定的确定是虚基类么?
rabo 2003-12-25
  • 打赏
  • 举报
回复
ding!
xiaohyy 2003-12-25
  • 打赏
  • 举报
回复
to jiangsheng(蒋晟.Net) :
这里不是怎么提取实现基类的问题,这个问题已经被我改成了单继承方式解决了。
现在的问题是为什么这种结构会编译不过。。
蒋晟 2003-12-25
  • 打赏
  • 举报
回复
把接口拆细

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧