问一个关于 C++ 的基础派生问题

IONPhantom 2014-07-03 06:05:35
举个例子,我从 IUnknow 接口派生了 5 个 COM 接口

class IMyInterfaceFirst : public IUnknow
{
public:
// 我自己的接口
};

众所周知 IUnknow 本身有3个接口需要实现
AddRef / Release / QueryInterface
在我的5个派生接口实现中 AddRef 和 Release 全都是一样的实现

int AddRef() { return ++iRef; }
int Release() { if(--iRef==0) delete this; }

可是这样5个接口的实现上面的代码就要写5次,实在太麻烦了。
我本来想先从 IUnknow 派生一个实现上面代码的类,可是还是有麻烦,如下

class CMyImp : public CIUnknow
{
public:
int AddRef() { return ++iRef; }
int Release() { if(--iRef==0) delete this; }
};


class CMyInterfaceFirstImp : public IMyInterfaceFirst , public CMyImp
{
};

这样的 CMyInterfaceFirstImp 的实现也不行。

难道遇到这种情况每个新派生的接口都需要把以前所有的接口实现一遍吗?
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2014-07-04
  • 打赏
  • 举报
回复
引用 3 楼 ri_aje 的回复:
class CMyInterfaceFirstImp : public IMyInterfaceFirst , public CMyImp { }; 增加自己 override queryinterface 即可,addref 和 release 可以复用 cmyimp 的。
说的不全对。class CMyInterfaceFirstImp 直接从 CMyImp 派生才行,否则就有那个 纯虚函数没有实现的问题;要么就像 #1 一样 virtual 继承,然后提供自己的 queryinterface.
ri_aje 2014-07-04
  • 打赏
  • 举报
回复
class CMyInterfaceFirstImp : public IMyInterfaceFirst , public CMyImp { }; 增加自己 override queryinterface 即可,addref 和 release 可以复用 cmyimp 的。
IONPhantom 2014-07-04
  • 打赏
  • 举报
回复
引用 7 楼 Saleayas 的回复:
反过来。 把 Iunknown 放在最后实现。 可以看看 ATL COM 的实现。
大侠能给具体解释一下么。。。
ri_aje 2014-07-04
  • 打赏
  • 举报
回复
引用 5 楼 P_hantom 的回复:
CMyInterfaceFirstImp 是 IMyInterfaceFirst 的实现,怎么可能从 CMyImp 直接派生呢,从 CMyImp 派生那和 IMyInterfaceFirst 还有啥关系。。。
不搞 com,分不清那些 iunknown,ciunknown,xxxunknow 的东西,看着就头疼。你能不能发个简短完整的代码把问题展示出来?
IONPhantom 2014-07-04
  • 打赏
  • 举报
回复
CMyInterfaceFirstImp 是 IMyInterfaceFirst 的实现,怎么可能从 CMyImp 直接派生呢,从 CMyImp 派生那和 IMyInterfaceFirst 还有啥关系。。。
Saleayas 2014-07-04
  • 打赏
  • 举报
回复
反过来。 把 Iunknown 放在最后实现。 可以看看 ATL COM 的实现。
IONPhantom 2014-07-03
  • 打赏
  • 举报
回复
你的方法不行,需要注意的是 IUnknow 的 AddRef / Release / QueryInterface 都是纯虚函数,是没有实现的 你这个方法实现的 CMyInterfaceFirstImp 编译是通不过的,错误是 CMyInterfaceFirstImp 的 AddRef / Release / QueryInterface 三个接口没有实现。
NeDong 2014-07-03
  • 打赏
  • 举报
回复
引用 楼主 P_hantom 的回复:
举个例子,我从 IUnknow 接口派生了 5 个 COM 接口

class IMyInterfaceFirst : public IUnknow
{
public:
// 我自己的接口
};
众所周知 IUnknow 本身有3个接口需要实现 AddRef / Release / QueryInterface 在我的5个派生接口实现中 AddRef 和 Release 全都是一样的实现

int AddRef() { return ++iRef; }
int Release() { if(--iRef==0) delete this; }
可是这样5个接口的实现上面的代码就要写5次,实在太麻烦了。 我本来想先从 IUnknow 派生一个实现上面代码的类,可是还是有麻烦,如下

class CMyImp : public CIUnknow
{
public:
int AddRef() { return ++iRef; }
int Release() { if(--iRef==0) delete this; }
};

class CMyInterfaceFirstImp : public IMyInterfaceFirst , public CMyImp
{
};
这样的 CMyInterfaceFirstImp 的实现也不行。
这样是可行的,只是写法错了,需要用虚继承: class CMyImp : virtual public CIUnknow { public: int AddRef() { return ++iRef; } int Release() { if(--iRef==0) delete this; } }; class CMyInterfaceFirstImp : virtual public CIUnknow, public CMyImp { };

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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