#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==