The behavior you get is the expected one. The key is in the semantics of super. Let's see some examples before analyzing your case:
Example 1
ClassA "implements msg"
ClassB "implements msg"
ClassC "implements msg"
This means that the inherited version of msg is overridden in ClassB and ClassC. In this case
super msg "sent from ClassC invokes ClassB >> msg"
super msg "sent from ClassB invokes ClassA >> msg"
super msg "sent from ClassA will signal MessageNotUnderstood"
(I'm assuming msg is not implemented above ClassA)
Example 2
ClassA "implements msg"
ClassB "does not implement msg"
ClassC "implements msg"
Then
super msg "sent from ClassC invokes ClassA >> msg"
super msg "sent from ClassB invokes ClassA >> msg"
Example 3
ClassA "implements msg"
ClassB "does not implement msg"
ClassC "does not implement msg"
Here
super msg "sent from ClassC invokes ClassA >> msg"
super msg "sent from ClassB invokes ClassA >> msg"
So, the semantics of super is: start the lookup in my superclass.
Your case
Yo have
Object "implements class"
Sup "does not implement class"
Sub "does not implement class"
Therefore, when you send super class from Sub it will invoke Object >> class, right? Which is the same as sending self class (because class is not implemented in Sub), which is Sub. And since Sub new print_superclass sends super class from Sub, you get Sub.