C의 Dynamic_cast 연산자는 안전한 런타임 유형 식별 및 범위를 좁히는 강력한 도구입니다. 그 기능을 자세히 살펴보고 목적을 명확히 하기 위해 가상의 C 구현과 비교해 보겠습니다.
다음 C 코드 조각을 고려하세요.
struct A { virtual void f() { } }; struct B : public A { }; struct C { }; void f() { A a; B b; A* ap = &b; B* b1 = dynamic_cast<B*>(&a); // NULL, because 'a' is not a 'B' B* b2 = dynamic_cast<B*>(ap); // 'b' C* c = dynamic_cast<C*>(ap); // NULL. }
이 예에서는 동적_캐스트를 사용하여 런타임 유형 식별 및 캐스팅을 수행합니다. 기본 클래스 객체(ap)에 대한 포인터에 적용하면 파생 클래스 객체(B)에 대한 포인터를 반환하거나, 가리키는 객체가 대상 유형(C)이 아닌 경우 NULL을 반환합니다.
C는 Dynamic_cast에 해당하는 내장 기능을 제공하지 않습니다. 그러나 가상 함수 테이블(vtable) 접근 방식과 함께 RTTI(런타임 유형 정보)를 사용하여 유사한 기능을 구현할 수 있습니다.
struct A { int type_id; // Placeholder for RTTI }; struct B : public A { void f() { printf("B::f\n"); } }; struct C : public A { void f() { printf("C::f\n"); } }; void* dynamic_cast_c(void* pointer, int target_type_id) { A* base = (A*)pointer; if (base->type_id == target_type_id) { return (void*)pointer; } else { return NULL; } } int main() { A a; B b; A* ap = &b; B* b1 = (B*)dynamic_cast_c(ap, sizeof(B)); // Returns &b C* c1 = (C*)dynamic_cast_c(ap, sizeof(C)); // Returns NULL return 0; }
이 C 예에서 기본 클래스 A의 type_id 멤버는 RTTI를 대체하며 vtable은 유형별 함수(예: f())를 정의합니다. Dynamic_cast_c는 type_id를 비교하여 포인터가 대상 유형과 일치하는지 확인하고 일치하면 포인터를 반환합니다. 그렇지 않으면 NULL을 반환합니다.
그러나 C 구현은 상속 관계 및 다형성 동작과 관련된 더 복잡한 유형 검사 및 캐스팅 시나리오를 허용하는 C의 Dynamic_cast만큼 유연하지 않습니다.
위 내용은 C의 `dynamic_cast`는 런타임 유형 식별에 대한 가상의 C 구현과 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!