#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;
}
class Employee {
mylib::Person *a;
bool owna;
protected:
Employee (mylib::Person& x) : a(&x), owna(false) { } // use existing A
public:
Employee () : a(new mylib::Person), owna(true) { }
~Employee () { if (owna) delete a; }
void whoami() { a->whoami(); } // A - fowarding
};
struct Colleague : mylib::Friend, Employee {
Colleague () : mylib::Friend(), Employee(*static_cast<Person*>(this)) {};
using Friend::whoami;
};
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKbmFtZXNwYWNlIG15bGliIHsKCXN0cnVjdCBQZXJzb24gewoJCXN0YXRpYyBpbnQgY291bnRlcjsgCgkJaW50IGlkOyAKCQlQZXJzb24oKSA6IGlkKCsrY291bnRlcikge30KCQl2b2lkIHdob2FtaSgpIHsgY291dCA8PCAiSSdtICI8PGlkPDxlbmRsOyB9Cgl9OyAgLy9BCglzdHJ1Y3QgRnJpZW5kOiBQZXJzb24ge307IC8vQiAtPiBBCglpbnQgUGVyc29uOjpjb3VudGVyPTA7IAp9CmNsYXNzIEVtcGxveWVlIHsgCglteWxpYjo6UGVyc29uICphOwoJYm9vbCBvd25hOwpwcm90ZWN0ZWQ6CglFbXBsb3llZSAobXlsaWI6OlBlcnNvbiYgeCkgOiBhKCZ4KSwgb3duYShmYWxzZSkgeyB9ICAvLyB1c2UgZXhpc3RpbmcgQQpwdWJsaWM6IAoJRW1wbG95ZWUgKCkgOiBhKG5ldyBteWxpYjo6UGVyc29uKSwgb3duYSh0cnVlKSB7IH0gICAgIAoJfkVtcGxveWVlICgpIHsgaWYgKG93bmEpIGRlbGV0ZSBhOyB9Cgl2b2lkIHdob2FtaSgpIHsgYS0+d2hvYW1pKCk7IH0gLy8gQSAtIGZvd2FyZGluZyAKfTsKc3RydWN0IENvbGxlYWd1ZSA6IG15bGliOjpGcmllbmQsIEVtcGxveWVlIHsgCglDb2xsZWFndWUgKCkgOiBteWxpYjo6RnJpZW5kKCksIEVtcGxveWVlKCpzdGF0aWNfY2FzdDxQZXJzb24qPih0aGlzKSkge307IAoJdXNpbmcgRnJpZW5kOjp3aG9hbWk7IAp9OyAKCmludCBtYWluKCkgewoJbXlsaWI6OkZyaWVuZCBwMTsgICAvLyBvayAhICAKCXAxLndob2FtaSgpOyAKCQoJRW1wbG95ZWUgcDI7IAoJcDIud2hvYW1pKCk7IAoKCUNvbGxlYWd1ZSBwMzsgICAvLyBObyBkaWFtb25kICEgCglwMy53aG9hbWkoKTsgIC8vIG91Y2ggISEgbm90IGFsbG93ZWQ6IG5vIGRpYW1vbmQgc28gdGhlIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgZm9yIHdoaWNoIGJhc2Ugb2JqZWN0ID8gCglwMy5FbXBsb3llZTo6d2hvYW1pKCk7ICAgLy8gZmlyc3Qgb2NjdXJlbmNlIG9mIEEKCXAzLm15bGliOjpGcmllbmQ6Ondob2FtaSgpOyAvLyBzZWNvbmQgc2Vjb25kIG9jY3VyZW5jZSBvZiBBCgkKCXJldHVybiAwOwp9