#include <iostream>

struct A {
    void Foo() { std::cout << "foo" << std::endl; }
};

struct B : A {
    A* operator->() { return &a; }
    A a;
};

struct C : B {
    B& operator->() { return b; }
    B b;
};

struct D : C {
    C& operator->() { return c; }
    C c;
};

int main()
{
    D d;
    d->Foo();
}
