Ответы:
Это несомненно возможно. Проблема в том, что из-за overloaded functions с++ компилятор вынужден хранить типы аргументов функций (как обычных, так и методов класса) и принадлежность какой-либо функции к классу в символе, по которому эта функция доступна в динамической библиотеке. Разные компиляторы, и иногда даже разные версии одного и того же компилятора, делают эти преобразования по разному. Т.е. нельзя определить заранее по имени функции, какой символ загружать из динамической библиотеки. Однако эти проблемы решаемы, хоть и с некоторым трудом. Методика подробно изложена в [1].
В этом документе информация о загрузке класса, если там известны заранее его методы - через создание абстрактного класса. А как быть если заранее не известны методы, которые будут в классе?
> А как быть если заранее не известны методы, которые будут в классе?
А тогда каким образом реализовать следующее - есть ядро, к нему есть дополнения, которые несут на борту какие либо методы, есть еще модули, которые эти дополнения могут использовать, все вроде просто. НО допустим я создал новое дополнение, и модуль который его использует, каким образом подключить новый модуль и дополнение через ядро? Ведь набор новых методов в дополнении не известен.
Для этого и нужен полиморфизм. Для примера, есть класс дополнений "обработчик звука". У него методы "вывести диалог настройки", "обработать звук" и "получить результат". Другие методы в основной программе просто не нужны по логике работы. Все классы - дополнения наследуются от этого базового класса и все их возможности могут быть доступны через его абстрактный интерфейс. Поведение же самого класса-дополнения внутри его самого программа не только не может, но и не должна регламентировать, поэтому другие методы этого класса ей без надобности.
К предыдущему посту - нужно реализовать это так, чтобы не потребовалось перекомпилировать ядро для каждого изменния списка дополнений/модулей. Поэтому помещение новых заголовков в ядро отпадает.
Приведу пример из самой программы
Еще раз, все классы должны иметь набор доступных для вызова из программы цункций. Наподобие "загрузить", "обработать данные", "выгрузить" и тд. Этот фиксированный набор функций объединяется в абстрактный класс, который служит общим предком для всех классов-модулей. Здесь нет никакой разницы между тем, слинкованы ли они статически, либо загружаются из динамической библиотеки. В любом случае, в программе не может быть вызова неизвестного метода.
17 лет назад