However, you should define a plugin convention: which names (for
extern "C" C++ functions inside plugins) are used, with which signatures, in what order, etc.
For example, you could decide that every plugin should have a function
extern "C" void my_plugin_init(void); which your program would run (after having
dlsym-ed it) when loading a plugin, etc... That
my_plugin_init might register some other functions (perhaps by adding them to some global
std::map<std::string,std::function<BaseClass*(int)>> variable, etc....)
The Qt Plugins framework could inspire you.