#include <iostream>
using namespace std;

struct CommonBase {
	CommonBase() : CommonBase(0) {}
	
	CommonBase(int val) : value(val) {}

	const int value;
};

struct DerivedA : public virtual CommonBase {
	void printValue() {
		std::cout << "The value is " << value << "\n";
	}
};

struct DerivedB : public virtual CommonBase {
	void printValueTimes2() {
		std::cout << "value * 2 is " << value * 2 << "\n";
	}
};

struct Joined : public DerivedA,
				public DerivedB {
	Joined(int val) : CommonBase(val) {
		std::cout << "Constructor value is " << val << "\n";
		std::cout << "Actual value is " << value << "\n";
	}
};

struct JoinedDerivedA : public Joined {
	JoinedDerivedA() : Joined(99) {
		printValue();
	}
};

struct JoinedDerivedB : public Joined {
	JoinedDerivedB() : Joined(99), CommonBase(99) {
		printValue();
	}
};

int main() {
	std::cout << "======= Joined =======\n";
	Joined j(99);
	j.printValue();
	std::cout << "\n=== JoinedDerivedA ===\n";
	JoinedDerivedA a;
	std::cout << "\n=== JoinedDerivedB ===\n";
	JoinedDerivedB b;
	
	return 0;
}