#include <iostream>
using namespace std;
namespace mylib {
struct Person {
static int counter;
int id;
Person() : id(++counter) {}
void whoami() { cout << "I'm "<<id<<endl; }
}; //A
struct Friend: Person {}; //B -> A
int Person::counter=0;
}
struct Employee : virtual mylib::Person {}; // C->A
struct Colleague : Employee, mylib::Friend {}; // D->(B,c)
int main() {
mylib::Friend p1; // ok !
p1.whoami();
Employee p2;
p2.whoami();
Colleague p3; // No diamond !
//p3.whoami(); // ouch !! not allowed: no diamond so the function has to be called for which base object ?
p3.Employee::whoami(); // first occurence of A
p3.mylib::Friend::whoami(); // second second occurence of A
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKbmFtZXNwYWNlIG15bGliIHsKCXN0cnVjdCBQZXJzb24gewoJCXN0YXRpYyBpbnQgY291bnRlcjsgCgkJaW50IGlkOyAKCQlQZXJzb24oKSA6IGlkKCsrY291bnRlcikge30KCQl2b2lkIHdob2FtaSgpIHsgY291dCA8PCAiSSdtICI8PGlkPDxlbmRsOyB9Cgl9OyAgLy9BCglzdHJ1Y3QgRnJpZW5kOiBQZXJzb24ge307IC8vQiAtPiBBCglpbnQgUGVyc29uOjpjb3VudGVyPTA7IAp9CnN0cnVjdCBFbXBsb3llZSA6IHZpcnR1YWwgbXlsaWI6OlBlcnNvbiB7fTsgLy8gQy0+QQpzdHJ1Y3QgQ29sbGVhZ3VlIDogRW1wbG95ZWUsIG15bGliOjpGcmllbmQge307ICAvLyBELT4oQixjKQoKaW50IG1haW4oKSB7CglteWxpYjo6RnJpZW5kIHAxOyAgIC8vIG9rICEgIAoJcDEud2hvYW1pKCk7IAoJCglFbXBsb3llZSBwMjsgCglwMi53aG9hbWkoKTsgCgkKCUNvbGxlYWd1ZSBwMzsgICAvLyBObyBkaWFtb25kICEgCgkvL3AzLndob2FtaSgpOyAgLy8gb3VjaCAhISBub3QgYWxsb3dlZDogbm8gZGlhbW9uZCBzbyB0aGUgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCBmb3Igd2hpY2ggYmFzZSBvYmplY3QgPyAKCXAzLkVtcGxveWVlOjp3aG9hbWkoKTsgICAvLyBmaXJzdCBvY2N1cmVuY2Ugb2YgQQoJcDMubXlsaWI6OkZyaWVuZDo6d2hvYW1pKCk7IC8vIHNlY29uZCBzZWNvbmQgb2NjdXJlbmNlIG9mIEEKCQoJcmV0dXJuIDA7Cn0=