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