#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 ; 
} 
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IENvbW1vbkJhc2UgewoJQ29tbW9uQmFzZSgpIDogQ29tbW9uQmFzZSgwKSB7fQoJCglDb21tb25CYXNlKGludCB2YWwpIDogdmFsdWUodmFsKSB7fQoKCWNvbnN0IGludCB2YWx1ZTsKfTsKCnN0cnVjdCBEZXJpdmVkQSA6IHB1YmxpYyB2aXJ0dWFsIENvbW1vbkJhc2UgewoJdm9pZCBwcmludFZhbHVlKCkgewoJCXN0ZDo6Y291dCA8PCAiVGhlIHZhbHVlIGlzICIgPDwgdmFsdWUgPDwgIlxuIjsKCX0KfTsKCnN0cnVjdCBEZXJpdmVkQiA6IHB1YmxpYyB2aXJ0dWFsIENvbW1vbkJhc2UgewoJdm9pZCBwcmludFZhbHVlVGltZXMyKCkgewoJCXN0ZDo6Y291dCA8PCAidmFsdWUgKiAyIGlzICIgPDwgdmFsdWUgKiAyIDw8ICJcbiI7Cgl9Cn07CgpzdHJ1Y3QgSm9pbmVkIDogcHVibGljIERlcml2ZWRBLAoJCQkJcHVibGljIERlcml2ZWRCIHsKCUpvaW5lZChpbnQgdmFsKSA6IENvbW1vbkJhc2UodmFsKSB7CgkJc3RkOjpjb3V0IDw8ICJDb25zdHJ1Y3RvciB2YWx1ZSBpcyAiIDw8IHZhbCA8PCAiXG4iOwoJCXN0ZDo6Y291dCA8PCAiQWN0dWFsIHZhbHVlIGlzICIgPDwgdmFsdWUgPDwgIlxuIjsKCX0KfTsKCnN0cnVjdCBKb2luZWREZXJpdmVkQSA6IHB1YmxpYyBKb2luZWQgewoJSm9pbmVkRGVyaXZlZEEoKSA6IEpvaW5lZCg5OSkgewoJCXByaW50VmFsdWUoKTsKCX0KfTsKCnN0cnVjdCBKb2luZWREZXJpdmVkQiA6IHB1YmxpYyBKb2luZWQgewoJSm9pbmVkRGVyaXZlZEIoKSA6IEpvaW5lZCg5OSksIENvbW1vbkJhc2UoOTkpIHsKCQlwcmludFZhbHVlKCk7Cgl9Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6Y291dCA8PCAiPT09PT09PSBKb2luZWQgPT09PT09PVxuIjsKCUpvaW5lZCBqKDk5KTsKCWoucHJpbnRWYWx1ZSgpOwoJc3RkOjpjb3V0IDw8ICJcbj09PSBKb2luZWREZXJpdmVkQSA9PT1cbiI7CglKb2luZWREZXJpdmVkQSBhOwoJc3RkOjpjb3V0IDw8ICJcbj09PSBKb2luZWREZXJpdmVkQiA9PT1cbiI7CglKb2luZWREZXJpdmVkQiBiOwoJCglyZXR1cm4gMDsKfQ==