0
C++ How to avoid Object Slicing with derived classes being stored in base vector
Hey everyone, I am not sure if this is elegant, but I want to store multiple derived classes in a base vector but I don’t want my objects to get sliced. I can’t figure this out. For example, let’s say I have a base class “Item” and derived classes “Weapon” or “Armor”. I want to store the derived classes in a “vector<Item*> “ but the object get sliced to the base class. Can anyone assist me here? Maybe creating a copy constructor would fix this?
4 ответов
+ 4
Object will get sliced only if you store it in vector as object, like vector<Item>
If you store a pointer to an object in vector like vector<Item*> then the object will not get sliced.
Use dynamic_cast for safe casting to derived class like
weapon = dynamic_cast<Weapon*>(v[i])
Also you can replace pointer to Item (Item*) with shared_ptr<Item>
+ 4
In your code object is not sliced. You just don't override getClass() method.
Also getName() is not defined in class A
You should declare class A as folow
class A {
public:
virtual void getClass() {
cout << "A";
}
virtual void getName(){}
};
+ 1
andriy kan Thank you for your response. This was the explanation that I needed. I searched through many different sources and I became confused. Making the methods virtual was the key. I assumed that the objects were being sliced but that wasnt the case. Thanks again
0
Here is an example, is there a solution to this or will i have to come up with a different data structure? I am not sure what i am missing.
https://code.sololearn.com/cW9fA8XP4iaP/?ref=app