#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Item{
public:
virtual ~Item() {}
};
class Armor : public Item{
};
void equipArmor(shared_ptr<Item> item){ //Armor class argument
shared_ptr<Armor> a = dynamic_pointer_cast<Armor>(item);
if (a) {
cout << "Armor"<<endl;
}
else cout << "Item"<<endl;
}
int main(){
vector<shared_ptr<Item>> items;
shared_ptr<Item> a = make_shared<Armor>();
items.push_back(a);
shared_ptr<Item> i = make_shared<Item>();
items.push_back(i);
equipArmor(items[0]); //Call function with an "Item" as an argument (even though it is in fact also an "Armor")
equipArmor(items[1]); //Call function with an "Item" as an argument (even though it is in fact also an "Armor")
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSXRlbXsKcHVibGljOiAKCXZpcnR1YWwgfkl0ZW0oKSB7fSAKfTsKCmNsYXNzIEFybW9yIDogcHVibGljIEl0ZW17Cn07Cgp2b2lkIGVxdWlwQXJtb3Ioc2hhcmVkX3B0cjxJdGVtPiBpdGVtKXsgLy9Bcm1vciBjbGFzcyBhcmd1bWVudAogICAgc2hhcmVkX3B0cjxBcm1vcj4gYSA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PEFybW9yPihpdGVtKTsgIAogICAgaWYgKGEpIHsKICAgIAljb3V0IDw8ICJBcm1vciI8PGVuZGw7IAogICAgfQogICAgZWxzZSBjb3V0IDw8ICJJdGVtIjw8ZW5kbDsgCgp9CgppbnQgbWFpbigpewogICAgdmVjdG9yPHNoYXJlZF9wdHI8SXRlbT4+IGl0ZW1zOwogICAgc2hhcmVkX3B0cjxJdGVtPiBhID0gbWFrZV9zaGFyZWQ8QXJtb3I+KCk7CiAgICBpdGVtcy5wdXNoX2JhY2soYSk7CiAgICBzaGFyZWRfcHRyPEl0ZW0+IGkgPSBtYWtlX3NoYXJlZDxJdGVtPigpOwogICAgaXRlbXMucHVzaF9iYWNrKGkpOwoKICAgIGVxdWlwQXJtb3IoaXRlbXNbMF0pOyAvL0NhbGwgZnVuY3Rpb24gd2l0aCBhbiAiSXRlbSIgYXMgYW4gYXJndW1lbnQgKGV2ZW4gdGhvdWdoIGl0IGlzIGluIGZhY3QgYWxzbyBhbiAiQXJtb3IiKQogICAgZXF1aXBBcm1vcihpdGVtc1sxXSk7IC8vQ2FsbCBmdW5jdGlvbiB3aXRoIGFuICJJdGVtIiBhcyBhbiBhcmd1bWVudCAoZXZlbiB0aG91Z2ggaXQgaXMgaW4gZmFjdCBhbHNvIGFuICJBcm1vciIpCn0K