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