fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct CommonBase {
  5. CommonBase() : CommonBase(0) {}
  6.  
  7. CommonBase(int val) : value(val) {}
  8.  
  9. const int value;
  10. };
  11.  
  12. struct DerivedA : public virtual CommonBase {
  13. void printValue() {
  14. std::cout << "The value is " << value << "\n";
  15. }
  16. };
  17.  
  18. struct DerivedB : public virtual CommonBase {
  19. void printValueTimes2() {
  20. std::cout << "value * 2 is " << value * 2 << "\n";
  21. }
  22. };
  23.  
  24. struct Joined : public DerivedA,
  25. public DerivedB {
  26. Joined(int val) : CommonBase(val) {
  27. std::cout << "Constructor value is " << val << "\n";
  28. std::cout << "Actual value is " << value << "\n";
  29. }
  30. };
  31.  
  32. struct JoinedDerivedA : public Joined {
  33. JoinedDerivedA() : Joined(99) {
  34. printValue();
  35. }
  36. };
  37.  
  38. struct JoinedDerivedB : public Joined {
  39. JoinedDerivedB() : Joined(99), CommonBase(99) {
  40. printValue();
  41. }
  42. };
  43.  
  44. int main() {
  45. std::cout << "======= Joined =======\n";
  46. Joined j(99);
  47. j.printValue();
  48. std::cout << "\n=== JoinedDerivedA ===\n";
  49. JoinedDerivedA a;
  50. std::cout << "\n=== JoinedDerivedB ===\n";
  51. JoinedDerivedB b;
  52.  
  53. return 0;
  54. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
======= Joined =======
Constructor value is 99
Actual value is 99
The value is 99

=== JoinedDerivedA ===
Constructor value is 99
Actual value is 0
The value is 0

=== JoinedDerivedB ===
Constructor value is 99
Actual value is 99
The value is 99