Введение
Позвольте мне заранее извиниться за длинный вопрос. Оно настолько короткое, насколько я мог, но, к сожалению, не очень короткое.
Настройка
Я определил два интерфейса, 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);
Вопрос * * 1023
Если я создаю свое основное приложение, связываясь с библиотеками 'testc' и 'testd', все работает как положено Однако если я изменю основное приложение, чтобы оно не связывалось с 'testc' и 'testd', а вместо этого загрузило их во время выполнения, используя dlopen
/ dlsym
, тогда dynamic_cast
завершится неудачей.
Я не понимаю, почему. Любые подсказки?
Дополнительная информация
- Протестировано с gcc 4.4.1, libc6 2.10.1 (Ubuntu 9.10)
- Пример кода доступно