#include <iostream>

struct Top {
    int value;
    Top(int val) : value(val) {}
    int get() {
        return value;
    }
};

struct Mid1 : Top {
    Mid1() : Top(3) {}
    int get() {
        return 1;
    }
};

struct Mid2 : Top {
    Mid2() : Top(4) {}
    int get() {
        return 2;
    }
};

struct Bottom : Mid1, Mid2 {
};

int main() {
    Bottom b;
    std::cout << b.Mid1::get() << std::endl;
    std::cout << b.Mid2::get() << std::endl;
    //std::cout << b.Top::get() << std::endl; // ERROR
    //std::cout << b.Mid1::Top::get() << std::endl; // ERROR
    //std::cout << b.Mid2::Top::get() << std::endl; // ERROR
    std::cout << static_cast<Mid1&>(b).Top::get() << std::endl; // OK
    std::cout << static_cast<Mid2&>(b).Top::get() << std::endl; // OK
    return 0;
}