On Saturday, 1 May 2021 at 08:03:45 UTC, frame wrote:


In case of a void* to abstract class casting, I assume the compiler just inserts the right vtable, so this cast is unproblematic - or is there also a pitfall?

I wouldn't expect there to be any consideration of vtables whatsoever. The compiler just reinterprets the pointer as a class reference, whether you're casting it to the original class or a superclass type. I mean, all of the functions available to the class are already in the vtable. There's no need to insert anything.

Whether you're getting at a class instance through a subclass (C) reference or a superclass (A) reference, abstract or not, it's still only a single instance located at a single address.

```d
import std.stdio;

abstract class A {
    void doIt();
}

class C : A {
    override void doIt() { writeln("Doing it"); }
}

void main()
{
    C c = new C;
    void* pc = cast(void*)c;
    A a = cast(A)pc;
    a.doIt();
}
```

So the pitfall is the same: when you're casting class references to and from pointers, it's up to you to ensure that the type you cast to is appropriate. You get no help from the compiler here.

Reply via email to