#include <iostream>
using namespace std;
class INondelegatingUnknown
{
public:
virtual void __stdcall NondelegationQueryInterface(void **ppv) = 0 ;
virtual void __stdcall shiyan() = 0 ;
virtual void __stdcall NondelegationAddRef() = 0;
virtual void __stdcall NondelegationRelease() = 0;
};
class IUnknown
{
public:
virtual void __stdcall QueryInterface(void **ppv) = 0 ;
virtual void __stdcall AddRef() = 0;
virtual void __stdcall Release() = 0;
};
class A:public IUnknown,public INondelegatingUnknown
{
virtual void __stdcall NondelegationQueryInterface(void **ppv) ;
virtual void __stdcall NondelegationAddRef() ;
virtual void __stdcall NondelegationRelease() ;
virtual void __stdcall QueryInterface(void **ppv) ;
virtual void __stdcall AddRef();
virtual void __stdcall Release() ;
virtual void __stdcall shiyan() ;
};
void A::QueryInterface(void **ppv)
{
cout<<"IUnknow's QueryInterface\n";
}
void A::AddRef()
{
cout<<"IUnknown' AddRef\n";
}
void A::Release()
{
cout<<"IUnknow's Release\n";
}
void A::NondelegationAddRef()
{
cout<<"NondelegationIUnknown' AddRef\n";
cout<<"good!\n";
}
void A::NondelegationQueryInterface(void **ppv)
{
cout<<"NondelegationIUnknow's QueryInterface\n";
cout<<"good!\n";
}
void A::NondelegationRelease()
{
cout<<"NondelegationIUnknow's Release\n";
cout<<"very good!\n";
}
void A::shiyan()
{
cout<<"shiyan"<<endl;
}
void main()
{
A a;
void** p=0;
cout<<&a<<endl;
cout<<(IUnknown*)(&a)<<endl;
cout<<(INondelegatingUnknown*)(&a)<<endl;
cout<<(IUnknown*)(INondelegatingUnknown*)(&a)<<endl;
((INondelegatingUnknown*)(&a))->NondelegationAddRef();
((INondelegatingUnknown*)(&a))->NondelegationQueryInterface(p);
((INondelegatingUnknown*)(&a))->NondelegationRelease();
((IUnknown*)(INondelegatingUnknown*)(&a))->AddRef();
((IUnknown*)(INondelegatingUnknown*)(&a))->QueryInterface(p);
((IUnknown*)(INondelegatingUnknown*)(&a))->Release();
cout<<&a<<endl;
cout<<(A*)(INondelegatingUnknown*)(&a)<<endl;
}
运行结果:
0012FF78 //this指针的值
0012FF78 //第一个基类的虚函数表的指针
0012FF7C //第二个基类的虚函数表的指针
0012FF7C //不相干的指针转化没有意义
NondelegationIUnknown' AddRef
good!
NondelegationIUnknow's QueryInterface
good!
NondelegationIUnknow's Release
very good!
shiyan //值得注意,因为shiyan在INondelegatingUnknown是第二个函数
NondelegationIUnknow's QueryInterface
good!
NondelegationIUnknown' AddRef
good!
0012FF78
0012FF78 //this指针的值