描述:
一个组件同时要实现IOleClientSite和IOleObject两个接口,但他们有一个函数GetMoniker一样,如何加关键字做区分
解决方案1:
写两个中间类:
方法1:
struct _IOleClientSite : public IOleClientSite
{
GetMoniker()
{ return ClientSite_GetMoniker();}
virtual ClientSite_GetMoniker() = 0;
};
struct _IOleObject : public IOleObject
{
GetMoniker()
{ return Object_GetMoniker();}
virtual Object_GetMoniker() = 0;
};
class Derived : public _IOleClientSite, public _IOleObject
{
public:
ClientSite_GetMoniker(){}
Object_GetMoniker(){}
}
方法2(如果你不想引入新的虚函数)
template<class DeriveType>
struct _IOleClientSite : public IOleClientSite
{
GetMoniker()
{ return static_cast<DeriveType*>(this)->ClientSite_GetMoniker();}
};
struct _IOleObject : public IOleObject
{
GetMoniker()
{ return static_cast<DeriveType*>(this)->Object_GetMoniker();}
};
class Derived : public _IOleClientSite<Derived>, public _IOleObject<Derived>
{
public:
ClientSite_GetMoniker(){}
Object_GetMoniker(){}
}
用组合方式实现不能同时实现。比如a实现site,b实现obj,然后b作为a的成员。然后在使用上
GetMoniker2(){
return b.GetMoniker();
}