-betterC and extern(C++) classes

Moritz Maxeiner via Digitalmars-d digitalmars-d at puremagic.com
Sun Sep 10 10:51:24 PDT 2017


On Sunday, 10 September 2017 at 15:08:50 UTC, Yuxuan Shui wrote:
> By the way, can we dynamic_cast extern(C++) classes in C++?

It doesn't work for me OOTB with dmd 2.075, at least (though I 
may be missing something):

--- classes.d ---
import core.memory;

extern(C++) class Parent
{
     char id()
     {
         return 'P';
     }
}

extern(C++) class Child : Parent
{
     override char id()
     {
         return 'C';
     }
}

extern(C++) Parent makeParent()
{
   auto p = new Parent;
   GC.addRoot(cast(void*) p);
   return p;
}

extern(C++) Child makeChild()
{
   auto c = new Child;
   GC.addRoot(cast(void*) c);
   return c;
}

extern(C++) void releaseParent(Parent p)
{
   GC.removeRoot(cast(void*) p);
}

extern(C++) void releaseChild(Child c)
{
   GC.removeRoot(cast(void*) c);
}
-----------------

--- main.cc ---
#include <iostream>

class Parent
{
   public:
     virtual char id();
};

class Child : public Parent
{
};

extern Parent* makeParent();
extern Child* makeChild();

extern void releaseParent(Parent* p);
extern void releaseChild(Child* c);


extern "C" void rt_init();
extern "C" void rt_term();

bool isChild(Parent* p)
{
   return nullptr != dynamic_cast<Child*>(p);
}

int main(int argc, char** argv)
{
   rt_init();

   Parent* p = makeParent();
   Child* c = makeChild();

   std::cout << p->id() << "\n";
   std::cout << c->id() << "\n";

   std::cout << "identifier\tChild\n";
   std::cout << "p\t" << isChild(p) << "\t";
   std::cout << "c\t" << isChild(c) << "\t";

   releaseChild(c);
   releaseParent(p);

   rt_term();
   return 0;
}
---------------

--- Compile&Link ---
$ dmd -c classes.d
$ g++ -std=c++11 -o main main.cc classes.o 
-L/path/to/dmd-2.075/lib64/ -lphobos2
/tmp/ccwjJ9Xe.o: In function `isChild(Parent*)':
main.cc:(.text+0x20): undefined reference to `typeinfo for Parent'
/tmp/ccwjJ9Xe.o:(.rodata._ZTI5Child[_ZTI5Child]+0x10): undefined 
reference to `typeinfo for Parent'
collect2: error: ld returned 1 exit status
--------------------


More information about the Digitalmars-d mailing list