#include #include using namespace std; class MyModule { virtual void Print() {} }; typedef MyModule* EntryArea(); typedef void DestroyArea(MyModule*); struct MyStruct { MyModule* Object; void* DLHandle; EntryArea* Entry; DestroyArea* Delete; }; class ParentClass { private: struct MyStruct Classes[5]; string Shared; public: void Load() { Shared = "./test.so"; Classes[0].DLHandle = dlopen(Shared.c_str(),RTLD_NOW); Classes[0].Entry = (EntryArea*) dlsym(Classes[0].DLHandle,"create"); Classes[0].Delete = (DestroyArea*) dlsym(Classes[0].DLHandle,"destroy"); Classes[0].Object = Classes[0].Entry(); } MyModule* GetObject() { return Classes[0].Object; } }; int main() { ParentClass clClass; MyModule* Child; clClass.Load(); Child = clClass.GetObject(); } ---- contents of test.so ---- #include using namespace std; typedef MyModule* EntryArea(); typedef void DestroyArea(MyModule*); struct MyStruct { MyModule* Object; void* DLHandle; EntryArea* Entry; DestroyArea* Delete; }; class MyModule { virtual void Print() {} }; class TestModule : public MyModule { public: void Print() { cout << "Test" << endl; } }; extern "C" MyModule* create() { return new TestModule(); } extern "C" void destroy(MyModule* m) { delete m; }