ATL中,接口有继承的情况下如何进行实现继承

kingyo 2013-06-20 10:59:37
ATL中的编程,遇到如下问题,求好的解决方案:
IA、IB是接口(IDL文件中定义),CA、CB是对应实现类(H和CPP文件中定义)

1.开始的时候,我定义了接口IA,并用CA来实现IA
2.后来我扩展了功能,因此定义了接口IB,使IB从IA继承
3.要用CB来实现IB
4.发现CA已经实现了IA接口,想着让CB从CA继承
5.这样CB只需要实现IB-IA

这种方式在ATL中如何实现?



CA的类声明:
class ATL_NO_VTABLE CA :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CA, &CLSID_A>,
public IA
{...};

请问,我该如何实现CB?
class ATL_NO_VTABLE CB :
...,
public CA,//???
public IB
{...}

...全文
127 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
redui 2013-06-24
  • 打赏
  • 举报
回复
这样做会有问题,会直接导致IA被继承两次,在做类型转换或者QI时会产生二义性错误。 正确的做法是必须改造CA,把它变成一个模板类,目的就是用来实现IA,其它的无用代码必须删除,实际上这个模板类也应该取个合适的名称,例如:
template<class T> class IAImpl // 注意这里不需要从IA派生,也不能继承CComObject...等类
{
public:
  // 这里实现IA的方法,注意不需要实现IUnknown
  virtual HRESULT IAFunc1(...)
  { ... }
  virtual HRESULT IAFunc2(...)
  { ... }
};
现在实现CB:
class CB : public CComObjectRootEx<...>, // 这两个基类只在最终组件类中才需要继承
                public CComCoClass<...>,
                public IAImpl<CB>, // 派生这个类,就不需要重复实现IA的方法了
                public IB // 派生这个接口是必须的
{
public:
  // 这里实现IB的所有方法
  virtual HRESULT IBFunc1() {...} 
};
如果需要实现一个独立的组件,只实现IA,那么应该这样写:
class CA : public CComObjectRootEx<...>, public CComCoClass<...>,
                public IAImpl<CA>,
                public IA
{
};
许文君 2013-06-24
  • 打赏
  • 举报
回复
在类视图里,右键CB,添加-》实现接口,选择IA的typelib
kingyo 2013-06-24
  • 打赏
  • 举报
回复
有没有人遇到过类似的需求啊?
fishion 2013-06-24
  • 打赏
  • 举报
回复
如果接口除了那三个标准的接口外,其它的都是不一样的,而且AddRef,Release这两个方法都是简单的加减,那可以具体重写QueryInterface,在里面实现新的获取接口的方法
sizyx 2013-06-20
  • 打赏
  • 举报
回复
CB中需要把IB中的接口是实现的

3,245

社区成员

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

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