介绍
让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。
设置
我定义了两个接口,A和B:
class A // An interface
{
public:
virtual ~A() {}
virtual void whatever_A()=0;
};
class B // Another interface
{
public:
virtual ~B() {}
virtual void whatever_B()=0;
};
然后,我有一个共享库“testc”构造 C 类的对象,实现 A 和 B,然后传递指向它们的 A 接口的指针:
class C: public A, public B
{
public:
C();
~C();
virtual void whatever_A();
virtual void whatever_B();
};
A* create()
{
return new C();
}
最后,我有第二个共享库“testd”,它以 aA*
作为输入,并尝试将其转换为 a B*
,使用dynamic_cast
void process(A* a)
{
B* b = dynamic_cast<B*>(a);
if(b)
b->whatever_B();
else
printf("Failed!\n");
}
最后,我有主应用程序,A*
在库之间传递 's:
A* a = create();
process(a);
问题
如果我构建我的主应用程序,链接到“testc”和“testd”库,一切都会按预期工作。但是,如果我将主应用程序修改为不链接到“testc”和“testd”,而是在运行时使用dlopen
/加载它们dlsym
,那么会dynamic_cast
失败。
我不明白为什么。有什么线索吗?
附加信息
- 使用 gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) 测试
- 可用的示例代码