COM聚合的简单模拟

前端之家收集整理的这篇文章主要介绍了COM聚合的简单模拟前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

COM中的聚合原理看起来比较简单,但是由于其要实现两个IUnknown,所以实现起来比包容复杂,下面我做了个简单的模拟程序,看起来就比较容易理解,代码如下:

#include <iostream.h>

class IUnknown
{
public:



virtual void funcM() = 0;
virtual void funcN() = 0;
virtual void funcP() = 0;
};

class INondelegation
{
public:
virtual void nonfuncM() = 0;
virtual void nonfuncN() = 0;
virtual void nonfuncP() = 0;

};

class A : public IUnknown
{
public:

virtual void funcM();
virtual void funcN();
virtual void funcP();

};
#if 1
void A::funcM()
{
cout<<"class A funcM IUnknown"<<endl;
}

void A::funcN()
{
cout<<"class A funcN IUnknown"<<endl;
}

void A::funcP()
{
cout<<"class A funcP IUnknown"<<endl;
}
#endif


class B : public A,
public INondelegation
{
public:
B::B();

virtual void funcM()
{
cout<<"class B funcM - INondelegation"<<endl;
}

virtual void funcN()
{
cout<<"class B funcN - INondelegation"<<endl;
}

virtual void funcP()
{
cout<<"class B funcP - INondelegation"<<endl;
}

virtual void nonfuncM();
virtual void nonfuncN();
virtual void nonfuncP();

};

B::B()
{

}


void B::nonfuncM()
{
cout<<"class B funcM INondelegation,no delegation"<<endl;
}


void B::nonfuncN()
{
cout<<"class B funcN INondelegation,no delegation"<<endl;
}

void B::nonfuncP()
{
cout<<"class B funcP INondelegation,no delegation"<<endl;
}

void trans(B& bt,void** pvv)
{
#if 1
*pvv = static_cast<A*>(&bt);
#else
*pvv = static_cast<INondelegation*>(&bt);
#endif
reinterpret_cast<IUnknown*>(*pvv)->funcM();

}


void main()
{
#if 1
//A a;
B b;
B* pp = &b;
IUnknown* pa = NULL;
trans(b,(void**)&pa);


//reinterpret_cast<IUnknown*>(pa)->funcM();

//pa->funcM();
#else

/*
B b;
INondelegation* pfb = &b;
IUnknown* pb = (IUnknown*)&b;
pb->funcM();
//pfb->nonfuncM();

*/

#endif

}

猜你在找的设计模式相关文章