Quote:

Output:

Object 1, Function 1

Derived::f1() -> Derived::f2() -> Derived::f3() -> Base::f3()

Object 1, Function 2

Derived::f2() -> Derived::f3() -> Base::f3()

Object 1, Function 3

Derived::f3() -> Base::f3()

Object 2, Function 1

Derived::f1() -> Derived::f2() -> Derived::f3() -> Base::f3()

Object 2, Function 2

Derived::f2() -> Derived::f3() -> Base::f3()

Object 2, Function 3

Derived::f3() -> Base::f3()

Object 3, Function 1

Derived::f1() -> Derived::f2() -> Derived::f3() -> Base::f3()

Object 3, Function 2

Base::f2() -> Derived::f3() -> Base::f3()

Object 3, Function 3

Derived::f3() -> Base::f3()

Of course you cant decide if its virtual or static by what it ends up on, since it always will end up stopping on Base::f3(); in this example because it doesnt go anywhere, and therefor would make all of your calls static.