What's the use of the static_cast<IDropSource*>
in this piece of code (taken from here):
HRESULT CDropSource::QueryInterface(REFIID riid, void **ppv){
IUnknown *punk = NULL;
if (riid == IID_IUnknown) {
punk = static_cast<IUnknown*>(this);
} else if (riid == IID_IDropSource) {
punk = static_cast<IDropSource*>(this);
}
*ppv = punk;
if (punk) {
punk->AddRef();
return S_OK;
} else {
return E_NOINTERFACE;
}
}
I fail to see what's the purpose of casting this
to IDropSource*
if it's going to be assigned to a variable of type IUnknown*
.
Does this make any difference when later calling punk->AddRef()
?
CodePudding user response:
the source's link is old cpp (since 2004)https://gcc.gnu.org/releases.html I think the g at that time have some difference operation like now, but after read the piece of code I saw its purpose is
only handle CDropSource::QueryInterface based on some case of riid
if (riid == IID_IUnknown) {
} else if (riid == IID_IDropSource) {
if the static_cast make this pointer = nullptr -> don't handle and return E_NOINTERFACE
if (punk) {
punk->AddRef();
return S_OK;
} else {
return E_NOINTERFACE;
}
at that time, I assume that static_cast
is quite similar to dynamic_cast
of new gcc
to verify you need to get exactly what gcc used for test the static_cast
operation
refer how dynamic_cast work : Regular cast vs. static_cast vs. dynamic_cast
PS: I can't find any information about what gcc version release dynamic_cast
feature
CodePudding user response:
My personal feeling is that the purpose of casts is to add reference counts to different interfaces