您的位置:首页 > 其它

关于指针的强制转化之一(基类有虚…

2014-02-24 15:02 183 查看
  
#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指针的值

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: