2013-03-10 3 views
9

나는 그것을 확장하는 하위 클래스와 하위 클래스를 가지고있다. 자식 클래스에는 부모 클래스에없는 자체 메서드가 있습니다. 즉, 기본 클래스에서 가상으로 선언하는 것은 실제로 옵션이 아닙니다.C++에서 부모 포인터에서 자식 메서드를 호출하는 방법?

class A { 
    public: 
    virtual void helloWorld(); 
}; 

class B : public A { 
    public: 
    virtual void helloWorld(); 
    void myNewMethod(); 
}; 

그런 다음 내 구현, 난에 대한 포인터를하고 난 B로 구축 :

((B *)x)->myNewMethod(); 

내 질문 :

// somewhere in a .cpp file 
A* x; 
x = new B(); 
x->myNewMethod(); // doesn't work 

나의 현재 솔루션을 캐스팅하는 것입니다 이 일을하는 더 깨끗한 방법이 있습니까, 아니면 갈 길을 캐스팅하고 있습니까?

답변

11

제 질문은, 이것을하는 더 깨끗한 방법이 있습니까, 아니면 갈 길을 캐스팅하고 있습니까?

이 경우 런타임 캐스팅이 정상인 것처럼 보입니다. 당신이 확신하는 경우,

B* pB = dynamic_cast<B*>(x); // This will return nullptr if x does not point 
          // to an object of type B 
if (pB != nullptr) 
{ 
    pB->myNewMethod(); 
} 

한편 그러나, C 스타일 캐스트보다는, 당신은 (당신이 B의 유형의 객체에 x 실제로 지적 있는지 확실하지 않은 경우) dynamic_cast<>를 사용한다

B* pB = static_cast<B*>(x); 
pB->myNewMethod(); 
1

AmyNewMethod()이라는 메서드를 정의하지 않으므로 호출 할 수 없습니다.

보통 캐스팅을 강력히 권장하지 않지만 실제로는 여기 캐스팅이입니다.

0

글쎄, 당신은 캐스팅해야하지만 당신은 함수에서 추한 주조 구문을 숨겨 코드 모양 청소기/읽기 쉽게 만들 수 있습니다 유형 B의 객체에 x 점, 당신은 static_cast<> 사용해야합니다 .

B* B_static_cast(A* item) 
{ 
    return static_cast<B*>(item); 
} 

A* item = new B(); 
B_static_cast(item)->funtion_in_B(); 
관련 문제