2013-08-03 5 views
-2

다른 클래스의 용기에 다형성 방법을 사용하는는 어떻게 두 클래스 아래와 같이이

std::vector<Plot*> plot_vector; 

plot_vector.append(new DynamicPlot()); 
plot_vector.append(new DynamicPlot()); 
plot_vector.append(new StaticPlot()); 
plot_vector.append(new StaticPlot()); 

그리고 난 경우) (update_real_time를 호출 할 인스턴스의 유형은 DynamicPlot입니다.

foreach(Plot *plot, plot_vector) 
{ 
    if(/* plot type == DynamicPlot */) 
    { 
     plot->update_real_time(); 
    } 
    plot->plot(); 
} 

여기에 어떤 패턴을 사용해야합니까? 빈 update_real_time() 메소드를 StaticPlot 클래스에 추가하는 것은 좋은 해결책이 아닌 것처럼 보입니다.

편집 : 위 코드는 실제 정보가 아닙니다. 나는 문제를 알리기 위해 그것을 썼다. 그것을 의사 코드 (psuedo code)라고 생각한다. 나는 액세스 한정자를 쓰는 것을 꺼려하지 않았다. 내 실제 코드에서는 개인 상속이나 슬라이싱 문제가 없습니다. 벡터의 인스턴스 포인터를 유지합니다. 오해해서 미안해. 나는 어쨌든 그것을 고치고있다.

+4

두 가지 문제점 : 1) 상속이 비공개입니다. 2) 객체 조각. 전자는 수정하기가 쉽지 않습니다. 후자는'Plot' 객체 대신'Plot'에 포인터 (아마도 스마트 포인터)를 저장해야한다는 것을 의미합니다. 그것은 당신이 설명하는 문제를 해결하기 시작하기도 전에입니다. – juanchopanza

+2

3) 가상 dtor 없음 (기본 클래스 포인터를 저장할 때 많은 문제가 있음). 객체를 슬라이스 할 때 현재 문제는 아니지만 포인터로 전환하면 문제가 될 가능성이 큽니다. – dyp

+0

내 진짜 코드는 내가 위에서 쓴 것과 다르다. 나는 지금 내 문제를 설명하기 위해 그것을 썼다. 어쨌든 나는 고칠 것이다. –

답변

1

당신은 dynamic_cast를 사용해야합니다 : 그 foreach 제외

foreach(Plot *plot, plot_vector) 
{ 
    DynamicPlot* p = dynamic_cast<DynamicPlot*>(plot); 
    if(p) 
    { 
     p->update_real_time(); 
    } 
    plot->plot(); 
} 

는 C++되지 않습니다, 당신은 너무 그것을 위해 실제 코드를 사용하는 것 때문에.

+0

정확히 내가 무엇을 찾고 있었습니까. foreach는 Qt에서 온 것입니다. –

+0

저는 C++ 11이 표준 라이브러리에서 foreach를 도입했다고 생각했습니다. – John

+1

@ 존 C++ 11은'for (range-declaration : for-range-initializer) 구문'의 형태로 범위 기반'for' 루프를 도입했습니다. –

관련 문제