代码仅仅为明确思路,可能有错误和不完善的地方,:)
#include <iostream>
using namespace std;
class IUnkonwn
{
public:
virtual void qdisp1(int IID,void**ptr)=0;
};
class NotIUnkonwn
{
public:
virtual void Notqdisp1(int IID,void**ptr)=0;
};
class CIX:public IUnkonwn
{
public:
virtual void IX()=0;
};
/
class CIY:public IUnkonwn
{
public:
virtual void IY()=0;
};
//
class CIZ:public IUnkonwn
{
public:
virtual void IZ()=0;
};
///
class ca:public CIY,CIZ,NotIUnkonwn //component ca
{
public:
ca(IUnkonwn *p_IUnkonwn)//将外部组件传入 ,那么被聚合的接口调用 qdisp1将是调用外部组件的 qdisp1,防止通过被聚合的接口暴露内部组件的其他接口
{
p_IUnkonwn_cb=p_IUnkonwn;
}
~ca()
{
cout<<"~ca()"<<endl;
}
virtual void Notqdisp1(int IID,void**ptr)
{
if(0==IID)
{
*ptr=(NotIUnkonwn *)this;
cout<<"p_IUnkonwn_ca被转化为 PNotIUnkonwn类型"<<endl;
return;
}
else
{
if(1==IID)
{
*ptr=(CIY *)this;
cout<<"Notqdisp1返回CA;IY "<<endl;
return;
}
if(2==IID)
{
*ptr=(CIZ *)this;
return;
}
}
*ptr=NULL;
return;
};
virtual void qdisp1(int IID,void**ptr)
{
p_IUnkonwn_cb->qdisp1(IID,ptr);
}
IUnkonwn *p_IUnkonwn_cb;
public:
virtual void IY(){cout<<"ca:IY"<<endl;}
virtual void IZ(){cout<<"ca:IZ"<<endl;}
};
/
///
class cb:public CIX //component cb 取得CA组件的IY接口但不暴露 IZ接口
{
public:
cb()
{
ca *pca=new ca(this);//初始化了 p_IUnkonwn_cb那么在返回的IY中调用 qdisp1将会使用CB的 qdisp1
pca->Notqdisp1(0,(void **)&p_IUnkonwn_ca); //p_IUnkonwn_ca被转化为 PNotIUnkonwn类型
}
~cb()
{
cout<<"~cb()"<<endl;
}
virtual void qdisp1(int IID,void**ptr)
{
if(0==IID)
{
*ptr=(IUnkonwn *)this;
return;
}
else
{
if(1==IID)
{
*ptr=(CIX *)this;
return;
}
if(2==IID)
{
p_IUnkonwn_ca->qdisp1(1,ptr); //关键部分 PNotIUnkonwn调用了 qdisp1
cout<<"//实际调用为Notqdisp1返回CA;IY "<<endl;
return;
}
}
*ptr=NULL;
return;
};
virtual void IX(){cout<<"cb:IX"<<endl;}
private:
IUnkonwn *p_IUnkonwn_ca;
};
int main()
{
cb *pcb=new cb;
CIY * PIY;
pcb->qdisp1(2,(void**)&PIY);
if(PIY!=NULL)
PIY->IY();
/
//试图通过PIY找到组件CA的其他接口
CIZ * PIZ;
PIY->qdisp1(1,(void**)&PIZ);
PIZ->IZ(); //使用的为CB的 qdisp1成功屏蔽掉了IZ;
cin.get();
}