2012-09-14 2 views
3

부모 클래스 "base"와 "base"에서 상속받은 다른 클래스 "derived"가 있습니다.dynamic_cast 대 부모 클래스의 가상 함수 노출 (C++)

"derived"에는 1 가지 방법 cH1이 있습니다. 나는이 할 경우

는 :

base* b = new derived(); 

을 그리고 나는이 작업을 수행 할 수 있도록하려면 :

  • :

    분명히
    b->cH1(); 
    

    나는 2 개 솔루션가 없습니다 cH1을 순수 가상으로 기본으로 선언하십시오.

  • 또는 이렇게 :

    더 나은 방법입니다 하나
    dynamic_cast<derived*>(b)->cH1(); 
    

?

+2

대문자 잠금 키를 끄십시오. 'PARENT'는 이름이 매크로임을 제안합니다. 'parent'는 일반적인 사용법입니다. –

+1

나는 당신의 머리에서 가장 큰 문제는 "부모"와 "자식"이라는 단어를 사용하는 것일 수 있다고 말하고 싶습니다. 그것들은 기초 파생 클래스와 파생 클래스를위한 * 정말 끔찍한 * 은유입니다 : 일반적으로 말하자면, 아이는 대개 부모가 아니며 더 구체적인 부모 인스턴스도 아닙니다. 훨씬 더 나은 은유는 "기본 클래스"와 "파생 된 클래스"입니다. –

+0

구문 문제가 수정되었습니다. – Kam

답변

7

cH1 방법이 의미 상으로 base에 적용되는 경우 base의 방법으로 만드십시오. 그 외의 경우 cH1derived으로두고 dynamic_cast을 사용하십시오. 클래스의 의미론을 선택해야한다고 생각합니다. 당신이 기본 클래스 Vehicle 및 파생 클래스 Car, MotorbikeAircraft이있는 경우 예를 들어

TakeOff() 같은 방법은 Aircraft와 호환이 아닌 Car 또는 Motorbike 가진 의미를 가지고 당신은 TakeOff()Aircraft을 할 수 있도록 메서드가 아니라 Vehicle 메서드입니다.

+0

나는이 말을 계속 듣고 이해하지 못한다 :/ "의미 상"이라는 말은 무엇을 의미 하는가? – Kam

+2

@Kam : 예를 들어, 기본 클래스가 'Vehicle'이고 파생 클래스가 'Car','Motorbike '및'Aircraft' 인 경우 'TakeOff()'와 같은 메소드는 '항공기'와 호환되는 의미를 가지지 만 'Car' 또는'Motorbike'를 사용하여'TakeOff() '를'Vehicle' 메소드가 아닌'Aircraft' 메소드로 만들고 싶을 수도 있습니다. –

2

dynamic_cast은 더 부드럽고 유연하지만 약간 느립니다.

dynamic_cast을 사용하여 NULL에 대해 반환 된 포인터를 검사 할 때를 기억하십시오.

+0

'dynamic_cast'는 더 깨끗하고 유연한 방법은 무엇입니까? 'dynamic_cast'가 정당화 될 수있는 경우가 있지만, 주어진 정보에서 이것이 우리 중 하나임을 결론 지을 수 있다고 생각하지 않습니다. (일반적으로 가상 함수의 사용은 더 깨끗합니다.) –

+0

@JamesKanze, 부모 클래스가 해당 클래스와 관련이없는 함수로 복잡하지 않은 경우에는 더 깨끗합니다. 나는 확실히 알기 위해 상세한 수업 정보가 필요하다는 것에 동의한다. –

3

먼저 dynamic_cast을 사용하려면 base에 가상 기능이 하나 이상 있어야합니다.

두 번째로, dynamic_cast의 사용은 이고 보통은 실수라고 표시합니다. derived이 실제로 base의 하위 항목 인 경우 derived 개체는 base 개체가 예상되는 모든 곳에 서 있어야하며 보통 base에는 가상 가상 기능이 있거나 순수 가상이 아니며 derived은 일부 또는 전체를 재정의한다는 의미입니다. 그들.

cH1이 무엇인지 몰라도 접근법을 추천하는 것은 불가능합니다.

+0

항상 실수는 아닙니다. 때로는 공통점이 있지만 다른 점이없는 객체 모음이 필요한 경우가 있습니다. –

+0

구체적인 클래스에'dynamic_cast'를 사용하는 것은 거의 실수입니다 만, 클래스 (또는 클래스의 그룹)가 확장 된 인터페이스를 지원하는 것은 드문 일이 아닙니다. 이런 경우,'dynamic_cast'는 확장 인터페이스에 대한 액세스를 지원하는 한 방법입니다. –

+0

나는 간과 된 것 같아서 ** ** 보통 **이라는 단어에 중점을 두었습니다. 나는 항상 실수라고 말하지 않았다. –