Из этого комментария к одному из ответов я думаю, что вы действительно не хотите достичь того, о чем вы здесь просите, а наоборот. Комментарий, на который я ссылаюсь:
Часть 1:
Я знал, что у нас не может быть виртуального
конструктор и я не хочу иметь
Во-первых, моя цель - компилятор
статическая проверка кода, которая предупредит
мне, если я забыл реализовать конкретный
конструктор прототип.
Часть 2:
Мой проект
плагин, как динамическая система загрузки и
Я каким-то образом навязываю ctors
прототипы реализации третьего
код партии.
То, что вы спрашиваете в этом вопросе, равно 1, и вы можете применить его по-разному, просто прочитав некоторые ответы, или посмотрите на примеры метапрограммирования и библиотеку boost :: type_traits.
Теперь, если вам действительно нужна часть 2: предоставить механизм подключаемого модуля с динамической загрузкой, то вам не нужно применять конструкторы, но есть общий интерфейс как для объектов подключаемых модулей, так и для создания объектов подключаемых модулей. Не существует способа создания экземпляра объекта с неизвестным (во время компиляции) объектом, и это означает, что вы не сможете вызывать конструкторы из своего кода. Я бы предложил
// Interface:
class plugin {
public:
virtual void operation() = 0;
};
class plugin_factory {
public:
virtual plugin* create() = 0;
virtual plugin* create( unsigned int ) = 0;
virtual plugin* create( unsigned int, QString const & ) = 0;
};
Пользователи должны будут предоставить реализацию плагина и фабрику, которая их создает. Вероятно, им потребуется реализовать точку входа для своей библиотеки, чтобы вы могли получить доступ к фабрике (или чтобы они могли зарегистрировать свою фабрику в вашей системе, иначе я бы предложил использовать библиотеку для этих целей (boost :: extension) похоже на место, чтобы посмотреть)