Допустим, у меня есть:
class Base {...};
class Derived1 : public Base {...};
class Derived2 : public Base {...};
class Derived3 : public Base {...};
class Store {
public:
void Add(const Base&); //Adds mix of Derived1/2/3
private:
vector<const Base*> vec;
vector<shared_ptr<const Base> > vec_smart;
};
//------------------------------------------------------
void Store::Add(const Base& b){
vec.push_back(&b); //got sliced
}
При использовании вектора указателей на Base он нарезался. Я полагаю, мне нужно использовать умные указатели, но я не могу заставить его работать.
Я пробовал что-то вроде:
auto tmp = make_shared<const Base> (b);
vec_smart.push_back(shared_ptr<const Base>(b));
Но все равно порезался. Что я делаю неправильно?
РЕДАКТИРОВАТЬ: у меня есть оператор ‹‹ в базовом классе, который вызывает виртуальную печать в производных классах.
ostream & operator <<(ostream & os, const Base & x) {
x.print(os);
return os;
}
void Base::print(ostream& os) const {
os << "Base";
}
void Derived1::print(ostream& os) const {
os << "Derived1";
}
когда я звоню
cout << b;
В Store::Add он выводится нормально, но когда я перебираю вектор после его сохранения, все, что я получаю, это «База»
ostream & operator <<(ostream & os, const Store & x) {
for (auto it = x.vec.begin(); it != x.vec.end(); ++it) {
os << *(*it) << endl;
}
return os;
}
Это плохой дизайн?
virtual
. Я отредактировал свой пост, чтобы использовать методы, аналогичные вашим. 20.04.2014a.Add(Derived("abc", 5));
Что я могу сделать с этим в своей реализации? 20.04.2014