Если C++-way (и C++-only), то через pimpl. Так делают в Qt, например.
То есть бинарно-совместимый класс, лежащий в хедере, устроенный так:
class Foo{
private:
unique_ptr<FooImp> impl;
public:
void DoSomethig();
};
//И .cpp файл, в котором лежит
struct FooImpl{
void ReallyDoSomethig(){doSomething;}
};
void Foo::DoSomething(){
impl->ReallyDoSomethig();
}
Foo::Foo() : impl(make_unique<FooImpl>()){
}
Чуть менее C++-way — интерфейс в .h файл,
Конкретный вопрос: как получить список сабклассов, от базового класса плагина.
С++ беден об информации о типах во время выполнения. Или руками (завести функцию getPluginSubclassesList() с вручную возвращаемым списком фабрик, ну или просто завести фабрику), или взять то, что эту информацию добавит. Возможно MOC из Qt умеет это.