LINUX.ORG.RU

g++ vs Dynamic Link (баг в таблицах виртуальных функций?)


0

0


имеется:

class Assignable; // находится в .so'шке, которая цепляется к бинарнику в процессе загрузки
class AssignableRawSocket : public Assignable; // находится в .so'шке которая подгружается dlopen'ом и регистрирует себя в map'е

virtual Assignable::init(std::string str); // инициализация родительского класса
virtual AssignableRawSocket::init(std::string str); // инициализация дочернего

Assignable * AssignableFactory::createObject();


AssignableRawSocket * a;
Assignable * a1;
AssignableFactory * f;


f = AssignableFactory::getFactoryByName(proto); // получаем одну из загруженых dlopen'ом фабрику
a = dynamic_cast<AssignableRawSocket *>(f->createObject()); // создаем дочерний объект, возвращаем указатель и неявно преобразуем к родительскому. Динамик кастим обратно - для наглядности
a1 = a; // опять неявно преобразуем

a->init(assignPath); // вызывается AssignableRawSocket::init() // вызывается дочерний init
a1->init(assignPath); // вызывается Assignable::init() // вызывается родительский init


★★★★★

Гм... чтобы было понятнее - вот testcase:
http://exor.com.ru/testcase.tar.gz там Makefile и там исходники нужные для демонстрации.

eXOR ★★★★★
() автор топика
Ответ на: комментарий от fghj

ммм..типа в обоих вызовах должен производный метод позваться, но странно чего не зовется...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.