fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. namespace mylib {
  5. struct Person {
  6. static int counter;
  7. int id;
  8. Person() : id(++counter) {}
  9. void whoami() { cout << "I'm "<<id<<endl; }
  10. }; //A
  11. struct Friend: Person {}; //B -> A
  12. int Person::counter=0;
  13. }
  14. class Employee {
  15. mylib::Person *a;
  16. bool owna;
  17. protected:
  18. Employee (mylib::Person& x) : a(&x), owna(false) { } // use existing A
  19. public:
  20. Employee () : a(new mylib::Person), owna(true) { }
  21. ~Employee () { if (owna) delete a; }
  22. void whoami() { a->whoami(); } // A - fowarding
  23. };
  24. struct Colleague : mylib::Friend, Employee {
  25. Colleague () : mylib::Friend(), Employee(*static_cast<Person*>(this)) {};
  26. using Friend::whoami;
  27. };
  28.  
  29. int main() {
  30. mylib::Friend p1; // ok !
  31. p1.whoami();
  32.  
  33. Employee p2;
  34. p2.whoami();
  35.  
  36. Colleague p3; // No diamond !
  37. p3.whoami(); // ouch !! not allowed: no diamond so the function has to be called for which base object ?
  38. p3.Employee::whoami(); // first occurence of A
  39. p3.mylib::Friend::whoami(); // second second occurence of A
  40.  
  41. return 0;
  42. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
I'm 1
I'm 2
I'm 3
I'm 3
I'm 3