Введение
Позвольте мне извиниться перед длинным вопросом. Это так же мало, как я мог это сделать, что, к сожалению, не очень короткое.
Настройка
Я определил два интерфейса: 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, которая принимает вход A*
и пытается передать его в B*
, используя dynamic_cast
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)
- Пример кода доступен