2016-11-28 1 views
0

는 부모 클래스가 부모 클래스를 확장하고, 두 개의 자식 클래스는 부모 클래스 확장이 있습니다 : 자식 1, 자식 2, 나는이 같은 부모 클래스와 자식을 참조 :C++ 자식 클래스가

function(Parent *c){ 
    c->someMethod(); 
} 

하지만, 아이에게는 child2에없는 메소드가 있습니다. 나는 문은 클래스가이 같은 자식 1인지 여부를 판단하는 경우를 추가하려고 :

function(Parent *c){ 
    if(c->getType() == 'child1'){ 
    c->someMethod(); 
    } 
} 

하지만 오류가 온다 '클래스 부모'에는 멤버 이름이 없다 '는 것으로 someMethod'그래서 어떻게 다루는?

+9

명백한 대답은 "캐스팅"입니다. * 올바른 * 대답은 "다형성을 잘못 사용하기 때문에 디자인을 다시 방문합니다"입니다. –

+0

[방문자 패턴] (https://en.wikipedia.org/wiki/Visitor_pattern)은 가능한 재 설계입니다. – Jarod42

답변

4

Parent에 대한 포인터로 작업 중이므로 Parent 유형의 메소드 만 호출 할 수 있습니다.

따라서 첫 번째 해결 방법은 모든 필요한 메서드를 Parent 클래스에 넣고 하위 클래스에서 재정의하는 것입니다. 이것은 다음에 비해 훨씬 더 좋습니다. 당신이 확신하는 경우

또 다른 가능한 솔루션은 child 포인터에 대한 올바른 및 호출 방법이 있다고, 필요 child 포인터에 dynamic_castParent 포인터입니다. 이것은 잘못된 디자인의 징후이며, 첫 번째 해결책을 고집하는 것이 좋습니다.

+0

당신이 ** sure ** 인 경우, 당신은'static_cast'를 사용할 수 있습니다. –

0

dynamic_casting을 올바른 유형으로 시도하십시오. 가능하지 않으면, 캐스트는 nullptr (또는 NULL)을 리턴해야합니다.

관련 문제