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
} (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|