2010-01-04 5 views
0

"콘텐츠"벡터에 객체를 추가하고 모두에 대해 show()를 사용하려고했습니다. 그러나 "Base"의 자식 (A, B) 인 객체는 "Base"유형처럼 동작합니다. 내 의도가 아닌 것은 입니다. 보이는 것처럼 가상 함수를 사용하려고했지만 작동하지 않습니다.객체 벡터

코드가 자체적으로 표현되기를 바랍니다.

class Base { 
    public: 
     virtual void show() { cout << "Base "; } 
}; 

class A : public Base { 
    public: 
     virtual void show() { cout << "A "; } 
}; 

class B : public Base { 
    public: 
     virtual void show() { cout << "B"; } 
}; 



vector<Base> content; 

void add(Base &o) { 
    content.push_back(o); 
} 

A test1; 
B test2; 

add(test1); 
add(test2); 

for (size_t i = 0; i < content.size(); i++) { 
     collection[i].show(); // output is: Base Base instead of A B 
} 

미리 감사드립니다.

답변

0
vector<Base*> content; // << 

void add(Base *o) { // << 
    content.push_back(o); 
} 

A test1; 
B test2; 

add(&test1); // << 
add(&test2); // << 

for (size_t i = 0; i < content.size(); i++) { 
     collection[i]->show(); // << 
} 
+1

답변 코드는 대개 많은 정보를 묘사하지 못합니다. 당신은 그것을 설명 할 필요가 있습니다 : 그것이 무엇을 해결하는지, 어떻게 해결하는지 등. 또한, 당신은'delete'를 언급하지 않고 있습니다. 편집 : 수락; 오, 아이러니. – GManNickG

+2

GMan : 아니요'new'도 아니고 'delete'도 아니요 – swegi

+0

충분하지만, 어쨌든 실제 코드에서 어떻게 사용되는지는 아닙니다. 'new'와'delete'를 사용할 것입니다. – GManNickG

1

STL 컨테이너는 값 개체를 저장합니다. 여기에있는 것은 슬라이스입니다.

3

보유하고있는 것은 기본 벡터입니다.
벡터에 아무것도 추가하지 않으면 벡터에 복사되지만 기본 부분 만 복사됩니다. 따라서 당신은 모든 비천한 정보를 잃어 버릴 것입니다.

이것은 슬라이싱 문제로 유추됩니다.

간단한 해결책은 포인터를 벡터에 저장하는 것입니다.

+0

더 나은 솔루션은 스마트 포인터를 벡터에 저장하는 것입니다. :-) –

0

는 현재 추가로 전달하는 객체가 유형 Base의 새로운 객체로를 복사되기 때문에 vector<Base*>을 사용해야합니다.

2

다른 사람들이 말했듯이, 당신은 조각을 겪고 있습니다. vectorBase을 저장하며 파생 된 정보는 분리됩니다.

포인터와 함께이 문제를 완화 :

std::vector<Base*> v; 
v.push_back(new A); 
v.push_back(new B); 

문제는 이제 리소스를 해제와 함께입니다. 벡터가 범위를 벗어나기 전에 벡터를 반복하고 각 요소를 삭제해야합니다. 예외적으로 더 심각한 문제가 있습니다.

벡터의 수명 중 어느 시점에서 예외가 발생하면 스택에서 언젠가 벡터의 모든 포인터를 해제하는 스택을 풀어줍니다. 하나의 거대한 메모리 누출.

전용 컨테이너를 더 많이 사용하는 경우이 문제를 방지 할 수 있습니다. 직접 작성하거나 (물론 권장하지는 않음) boost pointer containers을 사용하십시오.