Функциональные указатели будут работать или, альтернативно, если вы просто хотите разрешить несколько реализаций без изменения вызывающего кода, вы можете использовать наследование.
Посмотрите здесь длясравнение указателей функций и методов наследования.
Решение по наследованию будет выглядеть примерно так;Сначала создайте базовый класс, который реализует интерфейс, который вы хотите:
class BaseObjectiveFunction
{
BaseObjectiveFunction();
virtual ~BaseObjectiveFunction();
virtual double EvalObjectiveFunction(double);
virtual double EvalDerivativeFunction(double);
virtual double EvalSecondDerivativeFunction(double);
}
Затем реализуйте унаследованный класс, который имеет желаемую функциональность:
class LogLikelihood: public BaseObjectiveFunction
{
public:
LogLikelihood();
~LogLikelihood();
virtual double EvalObjectiveFunction(double);
virtual double EvalDerivativeFunction(double);
virtual double EvalSecondDerivativeFunction(double);
// Example of a function to pass in some data which the calculations rely on
bool SetInputData(double* somedata, int dataLen);
}
Наконец, чтобы вызвать этот код, который вы создаетеуказатель на ваш базовый класс и указание на реализацию, которая вас интересует (аналогично тому, как вы передавали бы указатели на функции):
LogLikelihood* pOF1 = new LogLikelihood(); // Create an instantiation of a specific solver
BaseObjectiveFunction* pCaller = pOF1; // Establish a pointer to the interface class and at the specific implementation.
// Now whatever calls the evaluate function can just use the pCaller and doesn't have to worry about the actual implementation.
pCaller->EvalObjectiveFunction(1.5);
Это вызовет две базовые реализации, которые (Iподумайте) что вы действительно хотите здесь.