vendredi 23 juin 2017

c++ vector smart pointer object slicing

How can I prevent object slicing in a vector while still using smart pointers? I'm aware of reference_wrapper, but I would like to keep using smart pointers. Problem is I get object slicing when adding items into the vector.

class Base {
    virtual void some_method() {
        // behave like Base
    }
}

class Derived : public Base {
    void some_method() override {
        // behave like Derived
    }
}

std::vector<std::shared_ptr<Base>> objects;

void add(std::shared_ptr<Base>& obj) {
    obj->some_method() // behaves like Derived
    objects.push_back(obj); // I tried using std::move() here
}

main() {
    auto obj = make_shared<Derived>();
    add(obj);
    objects[0]->some_method(); // behaves like Base
}

Aucun commentaire:

Enregistrer un commentaire