>백엔드 개발 >C++ >런타임 유형 검사에서 C의 `dynamic_cast`는 `static_cast`와 어떻게 다릅니까?

런타임 유형 검사에서 C의 `dynamic_cast`는 `static_cast`와 어떻게 다릅니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-01 15:29:15429검색

How Does C  's `dynamic_cast` Differ from `static_cast` in Runtime Type Checking?

C의 Dynamic_cast 이해

dynamic_cast는 이름에서 알 수 있듯이 C의 포인터 및 참조 변환에 대한 런타임 유형 검사를 가능하게 합니다. 컴파일 타임에 변환을 수행하는 static_cast와 달리 Dynamic_cast는 실행 시점에 검증을 해준다.

C에서 Dynamic_cast의 개념을 파악하기 위해 C 언어와 비교해 보자.

static_cast

static_cast<Type*>(ptr);

컴파일 시 ptr에서 Type*으로 유형 변환을 수행합니다. 시간. 그러나 유형이 관련되어 있다고 가정하고 유형이 호환되어야 합니다. 변환이 유효하지 않으면 프로그램이 컴파일되지 않습니다.

dynamic_cast

dynamic_cast<Type*>(ptr);

static_cast와 유사하게, Dynamic_cast는 포인터 ptr을 Type*으로 변환하려고 시도합니다. . 그러나 이 변환은 런타임에 발생합니다. 이는 특히 상속 및 다형성을 처리할 때 더 많은 유연성을 허용합니다.

제공된 예에서:

  • dynamic_cast(ap)는 ap를 B*로 성공적으로 변환합니다. B는 A에서 파생되었기 때문입니다.
  • dynamic_cast(ap) 및 Dynamic_cast(b)도 올바르게 작동합니다.
  • dynamic_cast(ap)는 C가 A에서 파생되지 않기 때문에 NULL을 반환합니다.
  • 참조의 경우, Dynamic_cast(&*ap) 둘 다 성공하지만 Dynamic_cast(&*ap)는 std::bad_cast 예외를 발생시킵니다.

Dynamic_cast 규칙:

  • Base- 파생된(B2D) 캐스트: 이 캐스트는 항상 유효한 포인터를 반환합니다. 포인터가 지정된 유형의 객체를 가리키는 경우. 포인터가 올바른 유형의 객체를 가리키지 않으면 NULL 포인터가 반환됩니다.
  • D2B(Derived-to-base) 캐스트: 이러한 캐스트는 항상 성공하고 유효한 포인터. 빈 포인터를 파생 유형으로 캐스팅하려고 하면 예외가 발생하며 그 결과 NULL 포인터가 발생합니다.

기본에서 파생으로 캐스팅하려면 관련된 클래스가 다형성이어야 한다는 점을 기억하세요. 이는 기본 클래스에 선언된 가상 함수가 하나 이상 있어야 함을 의미합니다.

위 내용은 런타임 유형 검사에서 C의 `dynamic_cast`는 `static_cast`와 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.