我想做以下reinterpret_cast操作:
rawType
,其中ppSwapChain1的类型为IUnknown **ppIUnknown = reinterpret_cast<IUnknown**>(ppSwapChain1);
我计划稍后IDXGISwapChain1**.
QueryInterface
或IDXGISwapChain
来自IDXGISwapChain1
;
IDXGISwapChain1通过以下层次结构从*ppIUnknown
继承。
IUnknown
- &GT; IDXGISwapChain1
- &GT; IDXGISwapChain
- &GT; IDXGIDeviceSubObject
- &GT; IDXGIObject
reinterpret_cast是合法且定义的操作吗?我不确定,并希望得到关于这个主题的反馈。我无法找到涵盖此特定问题的现有主题。
感谢。
答案 0 :(得分:0)
这是一个“强制转换”,绝不需要reinterpret_cast
或dynamic_cast
。您可以简单地使用static_cast
,因为您正在向上移动类型层次结构。您还可以安全地调用一个函数,该函数直接使用IUnknown*
IDXGISwapChain
对象,而不必完全投射它,因为公共继承允许这样做。
auto *iunk = static_cast<IUnknown*>( swapChain1 );
请记住,这实际上并没有增加底层对象的引用计数。您必须致电AddRef
或使用Microsoft::WRL::ComPtr
:
Microsoft::WRL::ComPtr<IUnknown*> iunk( swapChain1 );
你必须小心谨慎。
对于普通的C ++指针,您可以使用运行时类型信息(RTTI)并使用dynamic_cast
来验证类型在运行时实际上是否可转换,并处理可能的nullptr,如果类型不是兼容。或者你可以使用reinterpret_cast
如果你只想强制指针指向另一种类型,程序员可以确保结果始终有效。
使用COM,您使用QueryInterface
,它在功能上与dynamic_cast
相同,以查看给定的COM对象是否支持特定接口。或者更好的是,使用Microsoft::WRL::ComPtr
和As
运算符。
Microsoft::WRL::ComPtr<IDXGISwapChain1> swapChain1;
HRESULT hr = iunk.As( &swapChain1 );
if ( SUCCEEDED(hr) )
{
// swapChain1 is now a valid pointer to the COM object with another ref
}