On Friday, 4 January 2019 at 21:08:24 UTC, Ali Çehreli wrote:
[...]
In this case, casting is using the B object through it's A interface. The overridden behavior does not change.

Yeah... This was my mistake.

(Actually, that is possible in languages that support multiple inheritance through multiple virtual function pointer tables (vtbl) but D does not support that.)

Although I'm getting into implementation details here, I think it helps with understanding the semantics. There is only one vtbl per class object in D and the function entries are all filled in during construction. So, a B object's 'foo' slot in that table is filled with B.foo. So, such an object can foo() only as a B.

Nice :)

[...]

By the way, do you have a use case in mind? Perhaps there are other ways to achieve that.

Well, not really. I was just astonished that casting is not _the_ forge tool. Then, I checked, that the type indeed changes and wondered why the behavior was still from the object before casting.

But I assume, as in an A-type an A object, as well as a B object, can be stored, and the creation is under my own control - a use case would be some corner case... And the default virtual definition explains the behavior very well...

Reply via email to