#include<windows.h>
#include<iostream>
using namespace std;
class base{
public:
virtual int __stdcall query(int id,void ** p)=0;
virtual int __stdcall addRef()=0;
virtual int __stdcall release()=0;
};
class A:public base{
public:
virtual void __stdcall fa()=0;
};
class B:public base{
public:
virtual void __stdcall fb()=0;
};
class derived:public A,public B{
private:
unsigned long m_refcount;
public:
int __stdcall query(int id,void **p);
int __stdcall addRef();
int __stdcall release();
void __stdcall fa();
void __stdcall fb();
derived():m_refcount(1){
InterlockedIncrement(&m_refcount);
}
~derived(){
InterlockedDecrement(&m_refcount);
cout << "count:" << m_refcount << endl;
}
};
int __stdcall derived::query(int id,void **p){
if(id == 1){
*p = reinterpret_cast<base*>(this);//static_cast会报base *const 到base*转换异常,我也不知道为什么?
}
else if(id == 2){
*p = static_cast<A*>(this);//默认derive的首地址应该与A相同吧,由c++类的内存模型应该可以知道
}
else if(id == 3){
*p = static_cast<B*>(this);
}
else{
return -1;
}
reinterpret_cast<base*>(*p)->addRef();
cout << "count:" << m_refcount << endl;
return 0;
}
int __stdcall derived::addRef(){
return InterlockedIncrement(&m_refcount);
}
int __stdcall derived::release(){
if(0 == InterlockedDecrement(&m_refcount)){
delete this;
return 0;
}
return m_refcount;
}
void __stdcall derived::fa(){
cout << "A count:" << m_refcount << endl;
}
void __stdcall derived::fb(){
cout << "B count:" << m_refcount << endl;
}
int main(){
derived *d = new derived;
base* b = NULL;
d->query(1,reinterpret_cast<void**>(&b));
cout << "count:" << b->release() << endl;
A *a = NULL;
b->query(2,reinterpret_cast<void**>(&a));
a->fa();
cout << "count:" << a->release() << endl;
B *b1 = NULL;
b->query(3,reinterpret_cast<void**>(&b1));
b1->fb();
cout << "count:" << b1->release() << endl;
cout << "count:" << d->release() << endl;
delete d;
}
count:3
count:2
count:3
A count:3
count:2
count:3
B count:3
count:2
count:1
count:0