-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