#include <iostream>
#include <vector>
using namespace std;
class P {
private:
string nom;
public:
P(string n) : nom(n) {
}
virtual string toString() const {
return "P_" + nom;
}
};
class I {
public:
I(const P &p_, int a) : p(p_), amount(a) {
}
string desc() const {
string s;
s += " I_";
// call P::toString or PC::toString() ?
s += p.toString();
return s;
}
private:
const P &p; // could be PC or P
int amount;
};
class R {
private:
vector<I> ps;
string nom;
public:
R(string n) : nom(n) {
}
void add(const P & p) {
I i(p, 100);
ps.push_back(i);
}
string toString() const {
string s;
for (auto i : ps) {
s += i.desc();
}
return s;
}
};
class PC : public P {
private:
R r;
public:
PC(string n) : P(n), r(n) {
}
virtual string toString() const override {
string s;
s += "PC ";
s += P::toString();
s += r.toString();
return s;
}
void addToR(const P & p) {
r.add(p);
}
};
int main() {
P p1("abc");
P p2("def");
PC pc("abc_def");
pc.addToR(p1);
pc.addToR(p2);
cout << pc.toString() << endl;
P p3("hij");
PC pc2("hij_abc_def");
pc2.addToR(p3);
pc2.addToR(pc);
cout << pc2.toString() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjbGFzcyBQIHsKICBwcml2YXRlOgogICAgc3RyaW5nIG5vbTsKICAgIAogIHB1YmxpYzoKICAgIFAoc3RyaW5nIG4pIDogbm9tKG4pIHsKICAgIAogICAgfQogICAgCiAgICB2aXJ0dWFsIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKCQlyZXR1cm4gIlBfIiArIG5vbTsKCX0KfTsKCgoKY2xhc3MgSSB7CiAgcHVibGljOgogICAgSShjb25zdCBQICZwXywgaW50IGEpIDogcChwXyksIGFtb3VudChhKSB7Cgl9CgkKCXN0cmluZyBkZXNjKCkgY29uc3QgewoJICAgc3RyaW5nIHM7CgkgICBzICs9ICIgSV8iOwoJICAgLy8gY2FsbCBQOjp0b1N0cmluZyBvciBQQzo6dG9TdHJpbmcoKSA/CgkgICBzICs9IHAudG9TdHJpbmcoKTsKCSAgIAoJICAgcmV0dXJuIHM7Cgl9CiAgCiAgcHJpdmF0ZToKICAgIGNvbnN0IFAgJnA7ICAgLy8gY291bGQgYmUgUEMgb3IgUAogICAgaW50IGFtb3VudDsKICAKfTsKCgpjbGFzcyBSIHsKCQoJcHJpdmF0ZToKCSAgdmVjdG9yPEk+IHBzOwoJICBzdHJpbmcgbm9tOwoJICAKCXB1YmxpYzoKCSAgIFIoc3RyaW5nIG4pIDogbm9tKG4pIHsKCSAgIH0KCSAgIAoJICAgdm9pZCBhZGQoY29uc3QgUCAmIHApIHsKCQkgICBJIGkocCwgMTAwKTsKCQkgICBwcy5wdXNoX2JhY2soaSk7CgkgICB9CgkgICAKCSAgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKCQkgICBzdHJpbmcgczsKCQkgICBmb3IgKGF1dG8gaSA6IHBzKSB7CgkJCSAgIHMgKz0gaS5kZXNjKCk7CgkJICAgfQoJCSAgIHJldHVybiBzOwoJICAgfQoJICAgCgp9OwoKCmNsYXNzIFBDIDogcHVibGljIFAgewoJCglwcml2YXRlOgoJICBSIHI7CgkKCQoJcHVibGljOgoJCglQQyhzdHJpbmcgbikgOiBQKG4pLCByKG4pIHsKCX0KCQoJdmlydHVhbCBzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7CgkJc3RyaW5nIHM7CgkJcyArPSAiUEMgIjsKCQlzICs9IFA6OnRvU3RyaW5nKCk7CgkJcyArPSByLnRvU3RyaW5nKCk7CgkJCgkJcmV0dXJuIHM7Cgl9CgkKCXZvaWQgYWRkVG9SKGNvbnN0IFAgJiBwKSB7CgkJci5hZGQocCk7Cgl9CgoKfTsKCmludCBtYWluKCkgewoKICBQIHAxKCJhYmMiKTsKICBQIHAyKCJkZWYiKTsKICAKICBQQyBwYygiYWJjX2RlZiIpOwogIHBjLmFkZFRvUihwMSk7CiAgcGMuYWRkVG9SKHAyKTsKICAKICBjb3V0IDw8IHBjLnRvU3RyaW5nKCkgPDwgZW5kbDsKICAKICBQIHAzKCJoaWoiKTsKICBQQyBwYzIoImhpal9hYmNfZGVmIik7CiAgcGMyLmFkZFRvUihwMyk7CiAgcGMyLmFkZFRvUihwYyk7CiAgCiAgY291dCA8PCBwYzIudG9TdHJpbmcoKSA8PCBlbmRsOwogIAogIHJldHVybiAwOwogIAp9Cg==