#include struct A { A():value(123) {} int value; virtual int access() { return this->value; } }; struct B { B():value(456) {} int value; virtual int access() { return this->value; } }; struct C : public A, public B { C():better_value(789) {} int better_value; virtual int access() { return this->better_value; } }; struct D: public C { D():other_value(987) {} int other_value; virtual int access() { return this->other_value; } }; int use(B *b) { return b->access(); } int main() { C c; assert(use(&c) == 789); D d; assert(use(&d) == 987); return 0; }