#include #include #include struct Resource { Resource(char* byte) : byte_(byte) {} char* byte() const { return byte_; } virtual std::string name() const = 0; ~Resource() { delete byte_; } protected: char* byte_ = nullptr; }; struct ResourceA : Resource { ResourceA(char* byte) : Resource(byte) {} std::string name() const override { return std::string("ResourceA ").append(byte_); } }; struct ResourceB : Resource { ResourceB(char* byte) : Resource(byte) {} std::string name() const override { return std::string("ResourceB ").append(byte_); } }; struct ResourceFactory { Resource* makeResourceA(char* byte) { return new ResourceA{byte}; } Resource* makeResourceB(char* byte) { return new ResourceB{byte}; } }; struct ResourceCollection { void add(Resource* r) { resources.push_back(r); } void clear() { resources.clear(); } Resource* operator[](int index) { return resources[index]; } void printAll() { for (const auto & res : resources) { std::cout << res->name() << std::endl; } } private: std::vector resources; }; int main() { ResourceCollection collection; ResourceFactory rf; collection.add(rf.makeResourceA(new char{91})); collection.add(rf.makeResourceB(new char{92})); collection.printAll(); auto firstByte = collection[0]->byte(); collection.clear(); std::cout << *firstByte << std::endl; return 0; }