#include <iostream>
#include <memory>
 
using namespace std;
 
class Content {
public:
    virtual void info() = 0;
};
 
class ContentA : public Content {
public:
    void info() override { cout << "Content A" << endl; }
    int serial() { return 123; }
    int num() { return 456; }
};
 
class ContentB : public Content {
public:
    void info() override { cout << "Content B" << endl; }
    int identifier() { return 789; }
};
 
class Container {
public:
    Container(shared_ptr<Content> content) : m_content(content) {}
    virtual void info() = 0;
    void contentInfo() { m_content->info(); }
protected:
    shared_ptr<Content> m_content;
};
 
class ContainerA : public Container {
public:
    ContainerA(shared_ptr<ContentA> content) : Container(content) {}
    void info() override {
    	auto identifier = m_content->serial() * m_content->num();
    	cout << "Container A: " << identifier << endl;
    }
};
 
class ContainerB : public Container {
public:
    ContainerB(shared_ptr<ContentB> content) : Container(content) {}
    void info() override {
    	cout << "Container B: " << m_content->identifier() << endl;
    }
};
 
int main() {
	ContainerA containerA(make_shared<ContentA>());
	containerA.info();
	containerA.contentInfo();
 
	ContainerB containerB(make_shared<ContentB>());
	containerB.info();
	containerB.contentInfo();
 
	return 0;
}