c++ 다운 캐스팅 예제

그러나 때로는 다운 캐스트가 필요할 수 있습니다. 일반적인 예는 자식 클래스에대해서만 존재하는 비가상 함수를 호출하려는 경우입니다. 심하게 고려된 디자인의 일반적인 예는 Java 제네릭이 도입되기 전에 Java 컨테이너와 같은 상위 형식의 컨테이너이며, 다시 사용할 수 있도록 포함된 개체를 다운캐스팅해야 합니다. 다운캐스팅에 동적 캐스트를 사용하려면 기본 클래스가 다형성이어야 합니다. 가상 함수를 추가하여 기본 클래스 Person 수정: 부모가 자식이 아니므로(부모는 gotoSchool() 메서드가 필요하지 않음) 위의 줄에서 다운캐스팅하면 안전하지 않은 작업이 발생할 수 있습니다. C++에서 런타임 형식 검사는 dynamic_cast를 통해 구현됩니다. 컴파일 타임 다운캐스팅은 static_cast에 의해 구현되지만 이 작업은 형식 검사를 수행하지 않습니다. 잘못 사용 하는 경우 정의 되지 않은 동작을 생성할 수 있습니다. 클래스 기반 프로그래밍에서 다운캐스팅 또는 형식 구체화는 기본 클래스의 참조를 파생 클래스 중 하나에 캐스팅하는 작업입니다. 예를 들어 관리자와 서기가 모두 성과 성으로 식별되고 급여가 있는지 지정할 필요가 없습니다. 당신은 그들에 대한 정보를 표시하고 자신의 급여에 보너스를 추가 할 수 있습니다. Employee 클래스에서 이러한 속성을 한 번만 지정해야 합니다.

[1] 동적 캐스트의 소멸자 예제 코드를 사용하지 않고는 컴파일되지 않습니다. 이유를 설명하십시오. 사전에 감사합니다. 예, 당신이 제안하는 것은 업캐스팅 될 것입니다. 먼저 파생 개체가 만들어지고 파생 포인터가 기본 포인터에 업캐스트됩니다. 파생 개체의 기본 부분에 있는 기본 포인터 가리키기(파생 된 개체의 나머지 부분은 여전히 존재하며, Base를 통해 직접 액세스 할 수 없습니다.) 이를 위해 가상 함수가 필요하거나 파생 된 포인터로 다시 다운 캐스트해야합니다. 개체의 파생 된 부분이 여전히 존재 하므로 개체는 여기에 슬라이스 되지 않습니다. 실제로 파생 된 클래스 (Manager)의 개체를 가리키지 않는 기본 클래스 포인터 (Employee)를 다운 캐스트하려고하면 파생 클래스 개체 (노란색 영역)에 대한 정보가없는 메모리에 액세스 할 수 있습니다. 이것은 다운 캐스팅의 주요 위험입니다.

내 부분에 실수 — 당신은 (Visual Studio를 허용하더라도) r-값으로 비 const 참조를 초기화 할 수 없습니다. 참조가 lvalue로 초기화되고 있는지 확인하여이 작업을 해결하려면 예제를 업데이트했습니다. 업캐스팅 및 다운캐스팅은 서로 다른 데이터 형식의 간단한 캐스팅으로 이해해서는 안 됩니다. 그것은 큰 혼란으로 이어질 수 있습니다. 다운캐스트가 필요하지 않다면 디자인이 완벽할 것입니다. 파생 클래스의 개체가 아닌 기본 클래스의 개체를 가리키는 기본 클래스 포인터를 다운캐스트하려고 하면 어떻게 될까요? 이 코드를 컴파일하고 실행해보십시오: 안녕하세요 알렉스! 첫 번째 예제를 컴파일할 수 없습니다. 컴파일러는 형식이 다형성이 아니라고 말합니다. 나는 IDE와 gcc로 qtcreator를 사용하고 있습니다.

이유가 될 수 있습니까? 이와 반대로 기본 클래스 포인터(참조)를 파생 클래스 포인터(참조)로 변환하는 프로세스를 다운캐스팅이라고 합니다. 명시적 형식 캐스트가 없으면 다운캐스팅이 허용되지 않습니다. 이 제한의 이유는 is-a 관계가 대부분의 경우 대칭이 아니기 때문입니다.