#include <iostream>
#include <vector>
// B is abstract
class B
{
public:
virtual int getDefault() = 0;
};
class C : public B
{
public:
int getDefault() override { return 1; }
};
class D : public B
{
public:
int getDefault() override { return 5; }
};
class ObjectDisplay
{
public:
ObjectDisplay (B& b) : object (b) {}
void someFunction()
{
const auto result = object.getDefault();
// do something
std::cout << result << std::endl;
}
private:
B& object;
};
class Container
{
public:
void addDisplay()
{
displays.push_back (ObjectDisplay (c));
displays.push_back (ObjectDisplay (d));
}
void someFunction()
{
for (auto &display : displays)
display.someFunction();
}
private:
C c;
D d;
std::vector<ObjectDisplay> displays;
};
int main() {
Container c;
c.addDisplay();
c.someFunction();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKLy8gQiBpcyBhYnN0cmFjdApjbGFzcyBCCnsKcHVibGljOgogICAgdmlydHVhbCBpbnQgZ2V0RGVmYXVsdCgpID0gMDsKfTsKCmNsYXNzIEMgOiBwdWJsaWMgQgp7CnB1YmxpYzoKICAgIGludCBnZXREZWZhdWx0KCkgb3ZlcnJpZGUgeyByZXR1cm4gMTsgfQp9OwoKY2xhc3MgRCA6IHB1YmxpYyBCCnsKcHVibGljOgogICAgaW50IGdldERlZmF1bHQoKSBvdmVycmlkZSB7IHJldHVybiA1OyB9Cn07CgpjbGFzcyBPYmplY3REaXNwbGF5CnsKcHVibGljOgoJT2JqZWN0RGlzcGxheSAoQiYgYikgOiBvYmplY3QgKGIpIHt9CgoJdm9pZCBzb21lRnVuY3Rpb24oKQoJewogICAgCWNvbnN0IGF1dG8gcmVzdWx0ID0gb2JqZWN0LmdldERlZmF1bHQoKTsKICAgIAkvLyBkbyBzb21ldGhpbmcKICAgIAlzdGQ6OmNvdXQgPDwgcmVzdWx0IDw8IHN0ZDo6ZW5kbDsKCX0KCnByaXZhdGU6CglCJiBvYmplY3Q7Cn07CgpjbGFzcyBDb250YWluZXIKewpwdWJsaWM6CiAgICB2b2lkIGFkZERpc3BsYXkoKQogICAgewoJICAgIGRpc3BsYXlzLnB1c2hfYmFjayAoT2JqZWN0RGlzcGxheSAoYykpOwogICAgCWRpc3BsYXlzLnB1c2hfYmFjayAoT2JqZWN0RGlzcGxheSAoZCkpOyAgICAKICAgIH0KCiAgICB2b2lkIHNvbWVGdW5jdGlvbigpCiAgICB7CgkgICAgZm9yIChhdXRvICZkaXNwbGF5IDogZGlzcGxheXMpCiAgICAJCWRpc3BsYXkuc29tZUZ1bmN0aW9uKCk7CiAgICB9Cgpwcml2YXRlOgogICAgQyBjOwogICAgRCBkOwogICAgc3RkOjp2ZWN0b3I8T2JqZWN0RGlzcGxheT4gZGlzcGxheXM7Cn07CgppbnQgbWFpbigpIHsKCUNvbnRhaW5lciBjOwoJYy5hZGREaXNwbGF5KCk7CgljLnNvbWVGdW5jdGlvbigpOwoJcmV0dXJuIDA7Cn0=