reimplementing an interface in a derived class

Alex sascha.orlov at gmail.com
Fri Jan 4 22:48:53 UTC 2019


On Friday, 4 January 2019 at 21:47:59 UTC, Neia Neutuladh wrote:
> On Fri, 04 Jan 2019 08:46:24 +0000, Alex wrote:
>> Let's assume this is right. How to force a B object to behave 
>> like an A object? I thought casting is a possible approach...
>
> It requires a bit of surgery:

:)

>
>     import std.stdio;
>     class A
>     {
>         void foo() { writeln("hello from A!"); }
>     }
>     class B : A
>     {
>         override void foo() { writeln("hello from B!"); }
>     }
>     void main()
>     {
>         auto b = new B;
>         auto ptrB = cast(void**)b;
>         ptrB[0] = A.classinfo.vtbl.ptr;
>         b.foo();
>     }
>
> This takes advantage of the object layout used by DMD. 'vtbl' 
> is the virtual function table, which is basically an array of 
> function pointers. Each member function defined in a type (and 
> its super types) gets a unique index into that array.
>
> So when you write:
>
>     b.foo();
>
> That works out to:
>
>     (cast(void function(B))b.vtbl[5])(b);
>
> We replace object b's vtbl with class A's, and now b is just an 
> A with some extra stuff allocated in its memory block.
>
> Don't do this in production code. This is a terrible thing to 
> do in production code, or any code you intend to use other than 
> to see how D's object model works.

I see... That's cool nevertheless!


More information about the Digitalmars-d-learn mailing list