IUnknown::QueryInterface()
을 구현하는 일반적인 방법은 다음과 같습니다 다중 상속 시나리오에서 적절한 포인터 조정 여기QueryInterface 구현에서 dynamic_cast를 사용해야하는 경우가 있습니까?
if(iid == __uuidof(IInterfaceN)) {
*ppv = static_cast<IInterfaceN>(this);
//call Addref(), return S_OK
}
이제 static_cast
is necessary 다음 각 지원되는 인터페이스 ID에 대한 if-else-if
의 체인을 사용하지.
가끔씩 dynamic_cast
을 사용하는 구현이 있습니다. 시간 낭비 인 IMO는 결과가 같을 것이고 시간이 오래 걸리고 구현이 과장되게 될 것입니다.
dynamic_cast
를 사용하는 경우 IUnknown::QueryInterface()
구현 void**
매개 변수로 복사하기 전에 this
포인터를 캐스팅 실제로 필요가있다인가?
Emm ... 이러한 계층 구조의 가장 간단한 예를 제공해 주시겠습니까? – sharptooth
'Base'와'Derived1' ...'DerivedN' 클래스의 집합을 가정합니다. 여기서'Derived' 클래스는 각각'Interface1' ...'InterfaceM'의 임의 부분 집합을 구현합니다. 'Base :: QueryInterface'에서'this'가 요구 된 인터페이스에 대해'dynamic_cast'가 될 수 있는지를 확인합니다. – MSalters
좋아, 나는 그것을 볼 수있다. 대답에 포함시켜 주시겠습니까? – sharptooth