#include <string>
#include <iostream>
using namespace std;
class C1 {
protected:
int i;
public:
int getI() const { return i; }
void setI(int i_) { i = i_; }
};
class C2 {
protected:
string s;
public:
string getS() const { return s; }
void setS(string s_) { s = s_; }
};
class C3 {
protected:
float f;
public:
float getF() const { return f; }
void setF(float f_) { f = f_; }
};
class C12 : public virtual C1, public virtual C2
{
};
class C23 : public virtual C2, public virtual C3
{
};
class C123 : public virtual C1, public virtual C12, public virtual C23
{
};
void f1(C1& c1)
{
cout << "f1:\n";
cout << " getI: " << c1.getI() << endl;
}
void f2(C12& c12)
{
cout << "f2:\n";
cout << " getI: " << c12.getI() << endl;
cout << " getS: " << c12.getS() << endl;
}
void f3(C23& c23)
{
cout << "f3:\n";
cout << " getS: " << c23.getS() << endl;
cout << " getF: " << c23.getF() << endl;
}
void test()
{
C1 c1;
c1.setI(1);
f1(c1);
cout << "\n===== " << endl;
C12 c12;
c12.setI(12);
c12.setS("str12");
f1(c12);
f2(c12);
cout << "\n===== " << endl;
C123 c123;
c123.setI(123);
c123.setF(1.23f);
c123.setS("str123");
f1(c123);
f2(c123);
f3(c123);
cout << "\n===== " << endl;
}
int main()
{
test();
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEMxIHsKcHJvdGVjdGVkOgogICAgaW50IGk7CnB1YmxpYzoKICAgIGludCBnZXRJKCkgY29uc3QgeyByZXR1cm4gaTsgfQogICAgdm9pZCBzZXRJKGludCBpXykgeyBpID0gaV87IH0KfTsKCmNsYXNzIEMyIHsKcHJvdGVjdGVkOgogICAgc3RyaW5nIHM7CnB1YmxpYzoKICAgIHN0cmluZyBnZXRTKCkgY29uc3QgeyByZXR1cm4gczsgfQogICAgdm9pZCBzZXRTKHN0cmluZyBzXykgeyBzID0gc187IH0KfTsKCmNsYXNzIEMzIHsKcHJvdGVjdGVkOgogICAgZmxvYXQgZjsKcHVibGljOgogICAgZmxvYXQgZ2V0RigpIGNvbnN0IHsgcmV0dXJuIGY7IH0KICAgIHZvaWQgc2V0RihmbG9hdCBmXykgeyBmID0gZl87IH0KfTsKCmNsYXNzIEMxMiA6IHB1YmxpYyB2aXJ0dWFsIEMxLCBwdWJsaWMgdmlydHVhbCBDMgp7Cn07CgpjbGFzcyBDMjMgOiBwdWJsaWMgdmlydHVhbCBDMiwgcHVibGljIHZpcnR1YWwgQzMKewp9OwoKY2xhc3MgQzEyMyA6IHB1YmxpYyB2aXJ0dWFsIEMxLCBwdWJsaWMgdmlydHVhbCBDMTIsIHB1YmxpYyB2aXJ0dWFsIEMyMwp7Cn07CgoKdm9pZCBmMShDMSYgYzEpCnsKICAgIGNvdXQgPDwgImYxOlxuIjsKICAgIGNvdXQgPDwgIiAgZ2V0STogIiA8PCBjMS5nZXRJKCkgPDwgZW5kbDsKfQoKdm9pZCBmMihDMTImIGMxMikKewogICAgY291dCA8PCAiZjI6XG4iOwogICAgY291dCA8PCAiICBnZXRJOiAiIDw8IGMxMi5nZXRJKCkgPDwgZW5kbDsKICAgIGNvdXQgPDwgIiAgZ2V0UzogIiA8PCBjMTIuZ2V0UygpIDw8IGVuZGw7Cn0KCnZvaWQgZjMoQzIzJiBjMjMpCnsKICAgIGNvdXQgPDwgImYzOlxuIjsKICAgIGNvdXQgPDwgIiAgZ2V0UzogIiA8PCBjMjMuZ2V0UygpIDw8IGVuZGw7CiAgICBjb3V0IDw8ICIgIGdldEY6ICIgPDwgYzIzLmdldEYoKSA8PCBlbmRsOwp9Cgp2b2lkIHRlc3QoKQp7CiAgICBDMSBjMTsKICAgIGMxLnNldEkoMSk7CiAgICBmMShjMSk7CgogICAgY291dCA8PCAiXG49PT09PSAiIDw8IGVuZGw7CgogICAgQzEyIGMxMjsKICAgIGMxMi5zZXRJKDEyKTsKICAgIGMxMi5zZXRTKCJzdHIxMiIpOwogICAgZjEoYzEyKTsKICAgIGYyKGMxMik7CgogICAgY291dCA8PCAiXG49PT09PSAiIDw8IGVuZGw7CgogICAgQzEyMyBjMTIzOwogICAgYzEyMy5zZXRJKDEyMyk7CiAgICBjMTIzLnNldEYoMS4yM2YpOwogICAgYzEyMy5zZXRTKCJzdHIxMjMiKTsKICAgIGYxKGMxMjMpOwogICAgZjIoYzEyMyk7CiAgICBmMyhjMTIzKTsKCiAgICBjb3V0IDw8ICJcbj09PT09ICIgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7CiAgICB0ZXN0KCk7Cn0K