Beta D 2.069.0-b1
Szymon Gatner via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Wed Oct 14 06:26:03 PDT 2015
On Wednesday, 14 October 2015 at 13:12:00 UTC, Rainer Schuetze
wrote:
>
>
> On 14.10.2015 14:57, Szymon Gatner wrote:
>> extern(C++)
>> void freeSubtract(Operation animal) {
>> auto cat = cast(Subtract) animal; <<====== cast yields null
>> if(cat !is null) {
>> destroy(cat);
>> free(cast(void*) cat);
>> }
>> }
>>
>> extern(C++)
>> void useOperation(Operation t) {
>> auto res = t.execute(1, 2);
>> }
>>
>> Everything works fine except the marked line. Subtract
>> instance seems to
>> be created correctly on D side as it returns valid result in
>> the
>> execute() call on C++ side but then when trying to free the
>> instance on
>> D side again, downcast from Operation to Subtract fails
>> resulting in null.
>>
>
> To get compatible class layout, the D compiler has to omit it's
> class info entry in the vtable of C++ classes. In addition D
> doesn't know about C++ RTTI (I don't know if this is planned to
> add), so it cannot do the dynamic cast from Operation to
> Subtract.
>
> I have not tried, but calling the virtual destructor instead of
> destroy() might just work?
Mint that this code comes from Adam Ruppe's book, and it is
suppose to be working code. Also mind that Subtract is D class
and instantiated on D side, it is only briefly passed to C++ for
usage.
More information about the Digitalmars-d-announce
mailing list