#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
class Base
{
public:
virtual ~Base() {}
virtual void show() const = 0;
};
class A : public Base
{
public:
void show() const { std::cout << "A" << std::endl; }
};
class B : public Base
{
public:
void show() const { std::cout << "B" << std::endl; }
};
class C : public Base
{
public:
void show() const { std::cout << "C" << std::endl; }
};
class RandomFactory
{
public:
RandomFactory()
{
srand(time(0));
}
~RandomFactory()
{
for (std::vector<Base*>::const_iterator pos = pointers.begin();
pos != pointers.end(); ++pos)
{
delete *pos;
}
}
Base* generate()
{
int value = 1 + (rand() % 10);
Base* ptr =
value >= 1 && value < 7 ?
static_cast<Base*>(new A()) : value >= 7 && value < 10 ?
static_cast<Base*>(new B()) : static_cast<Base*>(new C());
ptr->show();
pointers.push_back(ptr);
}
private:
std::vector<Base*> pointers;
};
int main()
{
RandomFactory factory;
for (int i = 0; i < 10; ++i)
{
factory.generate();
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGN0aW1lPgoKY2xhc3MgQmFzZQp7CnB1YmxpYzoKICAgdmlydHVhbCB+QmFzZSgpIHt9CiAgIHZpcnR1YWwgdm9pZCBzaG93KCkgY29uc3QgPSAwOwp9OwoKY2xhc3MgQSA6IHB1YmxpYyBCYXNlCnsKcHVibGljOgogICB2b2lkIHNob3coKSBjb25zdCB7IHN0ZDo6Y291dCA8PCAiQSIgPDwgc3RkOjplbmRsOyB9Cn07CgpjbGFzcyBCIDogcHVibGljIEJhc2UKewpwdWJsaWM6CiAgIHZvaWQgc2hvdygpIGNvbnN0IHsgc3RkOjpjb3V0IDw8ICJCIiA8PCBzdGQ6OmVuZGw7IH0KfTsKCmNsYXNzIEMgOiBwdWJsaWMgQmFzZQp7CnB1YmxpYzoKICAgdm9pZCBzaG93KCkgY29uc3QgeyBzdGQ6OmNvdXQgPDwgIkMiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKY2xhc3MgUmFuZG9tRmFjdG9yeQp7CnB1YmxpYzoKICAgUmFuZG9tRmFjdG9yeSgpCiAgIHsKICAgICAgIHNyYW5kKHRpbWUoMCkpOwogICB9CiAgIH5SYW5kb21GYWN0b3J5KCkKICAgewogICAgICAgZm9yIChzdGQ6OnZlY3RvcjxCYXNlKj46OmNvbnN0X2l0ZXJhdG9yIHBvcyA9IHBvaW50ZXJzLmJlZ2luKCk7CiAgICAgICBwb3MgIT0gcG9pbnRlcnMuZW5kKCk7ICsrcG9zKQogICAgICAgewogICAgICAgICAgIGRlbGV0ZSAqcG9zOwogICAgICAgfQogICB9CiAgIEJhc2UqIGdlbmVyYXRlKCkKICAgewogICAgICAgaW50IHZhbHVlID0gMSArIChyYW5kKCkgJSAxMCk7CiAgICAgICBCYXNlKiBwdHIgPQogICAgICAgdmFsdWUgPj0gMSAmJiB2YWx1ZSA8IDcgPwogICAgICAgc3RhdGljX2Nhc3Q8QmFzZSo+KG5ldyBBKCkpIDogdmFsdWUgPj0gNyAmJiB2YWx1ZSA8IDEwID8KICAgICAgIHN0YXRpY19jYXN0PEJhc2UqPihuZXcgQigpKSA6IHN0YXRpY19jYXN0PEJhc2UqPihuZXcgQygpKTsKICAgICAgIHB0ci0+c2hvdygpOwogICAgICAgcG9pbnRlcnMucHVzaF9iYWNrKHB0cik7CiAgIH0KcHJpdmF0ZToKICAgc3RkOjp2ZWN0b3I8QmFzZSo+IHBvaW50ZXJzOwp9OwoKaW50IG1haW4oKQp7CiAgICBSYW5kb21GYWN0b3J5IGZhY3Rvcnk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpCiAgICB7CiAgICAgICAgZmFjdG9yeS5nZW5lcmF0ZSgpOwogICAgfQp9