#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;
}