업 캐스팅 / 다운 캐스팅이란 무엇입니까?


16

다형성에 대해 배울 때 일반적으로 다음과 같은 것을 볼 수 있습니다

class Base { int prv_member; virtual void fn(){} }
class Derived : Base { int more_data;  virtual void fn(){} }

업 캐스팅 또는 다운 캐스팅이란 무엇입니까? 가 (Derived*)base_ptr;업 캐스팅이나 풀이 죽은는?

난 당신이 기지에서 더 구체적인 무언가로 가고 있기 때문에 그것을 upcast라고 부릅니다. 다른 사람들은 최상위 계층이 루트 인 특정 계층 구조로 내려 가기 때문에 다운 캐스트라고 말했습니다. 그러나 다른 사람들은 내가 그것을 부르는 것으로 부르는 것 같습니다.

기본 ptr을 파생 ptr로 변환 할 때 업 캐스팅 또는 다운 캐스팅이라고합니까? 누군가가 공식 출처에 연결하거나 왜 그 출처를 그렇게 부르는지 설명 할 수 있다면.



3
중복되지 않습니다. 이 질문은 그것이 무엇인지 묻고, 다른 질문은 누가 이름을 생각해 냈는지 묻습니다.
Robert Harvey

1
@RobertHarvey "누군가가 공식 소스에 링크하거나 왜 그렇게 부르는 지 설명 할 수 있다면." 그러나 동의했지만 이는 질문의 일부로 만 간주 될 수 있습니다 .
Steven Jeuris

파생 클래스에서 해당 가상 을 조심 하십시오. Derived 클래스를 한 번 더 파생하지 않으면이를 작성하고 싶지 않습니다. void fn () {...}이면 충분합니다.
appoll

JustaPro : 추가 virtual는 불필요하지만 "다치게"하지 않습니다. 왜 그런 맥락에서 사용해서는 안된다고 생각하는지 자세히 설명 할 수 있습니까?
Nik Bougalis

답변:


17
Is (Derived*)base_ptr; an upcast or downcast?

다운 캐스트입니다. Wikipedia의 기사 를 참조하십시오 .

에서는 객체 지향 프로그래밍 , downcasting 또는 형 정제하는 행위이다 주조 파생 클래스 중 하나에베이스 클래스 참조.

많은 프로그래밍 언어에서 RTTI를 통해 참조 된 오브젝트의 유형이 실제로 캐스트되는 유형인지 또는 파생 된 유형인지 확인할 수 있으므로 그렇지 않은 경우 오류를 발행합니다.

즉, 기본 클래스 ( parent class ) 의 변수에 파생 클래스 ( child class ) 의 값이 있으면 다운 캐스팅이 가능합니다 ...


9

대부분의 언어에서 (내가 아는 한) 캐스트 일반화는 자동으로 수행됩니다. 따라서 일반적으로 계층 내에서 캐스트에 대해 말하면 전문 캐스트를 의미합니다. IMHO 두 유형을 분리하려는 대부분의 사람들은 상속 계층 구조를 트리로 생각하기 때문에 전문 캐스트 다운 캐스트라고합니다. 그리고 컴퓨터 과학에서 뿌리는 맨 위에있는 것으로 묘사됩니다. 이것의 이유는 컨벤션이거나 아마도 컴퓨터 과학자들 사이에서 생물 학자들에 대한 뿌리 깊은 증오 때문일 것입니다. (모든 말장난 의도)

편집 : 어쩌면 그것은 뿌리 깊은 증오입니다.


LOL은 +1해야합니다.)

2

페이지 상단에 "베이스"가 있고 하단에 잎이있는 나무를 그리는 일반적인 방법을 생각해보십시오. 기본 클래스가 맨 위에 있고 아래에 나뭇잎이있는 클래스 계층 구조를 이런 식으로 표현하면 업 캐스팅 및 다운 캐스팅이 리터럴이됩니다. 페이지에서 리프에서 기본으로 이동하는 것은 업 캐스트 및 페이지에서 기본 페이지에서 리프쪽으로 이동하는 것은 다운 캐스트입니다.


2
그러나 나무는 위로 올라가고 그들의 줄기는 땅에서 나오고 있습니다. (이것이 내가 계속 캐스트 생각하는 이유입니다)

@ acidzombie24 : 그러나 컴퓨터 과학에 관한 책에서, 당신은 나무가 일반적으로 위에서 설명한 것처럼 루트가 맨 위에 그려져 있음을 알 수 있습니다.
Jerry Coffin

알아요.하지만 난 그냥 재밌었어요. 나무 (실제 나무)와 기초 (기초와 같은 발)는 그것을 생각하는 나쁜 방법입니다 :(. +1

5
@ acidzombie24 : 호주의 나무라고 생각하면됩니다.
Martin York
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.