В коде C ++ я пытаюсь создать основной модуль, который определяет полиморфный базовый класс, который динамически загружает производные классы для него во время выполнения.Основной модуль имеет что-то вроде:
class Base {
public:
virtual ~Base();
virtual int f() = 0;
};
int main() {
auto make_a_ptr = /* load function pointer make_a from module using dsym */;
Base* a = make_a_ptr();
std::cout << a->f() << std::endl;
delete a;
}
Динамически загружаемый внешний модуль имеет:
class A : public Base {
public:
int f() {
return 123;
}
};
extern "C" Base* make_a() {
return new A;
}
Будет ли система, подобная этой, работать в Linux, без дополнительных шагов, касающихся динамического связывания?Потому что здесь только make_a
явно загружено с использованием dlsym()
, но основной модуль также вызовет A::f()
и A::~A()
и получит доступ к v-таблице A
.Будет ли это работать, даже если эти символы не были явно загружены?
И возможна ли подобная система на платформе Windows?