기본 클래스를 수락하는 함수를 호출 할 때 Dynamic_cast를 사용해야합니까?
-
06-07-2019 - |
문제
다음과 같은 수업이 있습니다.
interface class IA
{
};
interface class IB
{
};
public ref class C : public IA, public IB
{
};
public ref class D
{
void DoSomething(IA^ aaa)
{
}
void Run()
{
C^ bob = gcnew C();
DoSomething(dynamic_cast<IA^>(bob)); // #1
DoSomething(bob); // #2
}
};
현재 나는 그러한 함수를 호출 할 때 항상 동적 캐스팅을 사용하려고 노력합니다 (위의 #1).
그러나 코드를 매우 추악하게 만들므로 실제로 필요한지 알고 싶습니다.
이런 식으로 Dynamic_cast를 사용합니까? 그렇다면 주된 이유는 무엇입니까?
해결책
우리가 알고 있기 때문에 bob
유형입니다 C^
, 우리는 컴파일 시간에 다운 캐스트 될 수 있음을 알고 있습니다. IA^
안전하게 dynamic_cast
동일합니다 static_cast
여기. 또한, 당신이 제안한 암시 적 캐스트도 안전합니다.
dynamic_cast
기본 유형에서 파생으로 업 캐스트 할 때만 필요합니다.
다른 팁
Standard C ++에서는 Dynamic_cast를 사용하여 계층 구조를 걸어가는 것이 아닙니다. 이 경우 IA 또는 IB를 C로 변환하는 데 사용합니다.
IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);
아니요, C ++/CLI에서는 여기에 동적 캐스트가 필요하지 않다고 생각합니다. 모호성 WRT 다중 상속이없는 한, 파생*는 암시 적으로 기본으로 변환*입니다. "GC-Pointers"도 마찬가지입니다. C ++에서 동적 캐스트 (업 캐스팅시)에는 다형성 클래스가 필요합니다 (적어도 하나의 가상 기능이있는). 그래도 C ++/CLI가 어떻게 처리하는지 모르겠습니다. 나는 모든 CLI 클래스가 기본적으로 다형성이라고 생각합니다.
그건 그렇고 C ++ 태그를 제거 할 수 있습니다. ;)
제휴하지 않습니다 StackOverflow