C ++, как вы вызываете производную функцию-член из базового класса? - PullRequest
1 голос
/ 28 января 2020

У исходного программиста была эта идея, которая, кажется, работает на любом компиляторе, который он использовал, но не работает так хорошо в VS C ++. Практика выглядит очень сомнительной для меня.

У него есть базовый класс c, называемый mathObject, который имеет много общих математических функций. Кроме того, у него есть класс с именем Cosmos, а поверх него еще один класс с именем QuintCosmos.

Общая идея заключается в том, что он хочет вызвать функцию-член с такой же сигнатурой из либо Mathobject, либо Cosmos, либо QuintCosmos. Он пытается привести его к

typedef void (Mathobject::*moDerivs) (const double, const double*, double*)

Итак, подведем итог, он может иметь функцию с этой сигнатурой в любом месте этой иерархии, и он хочет рассказать третьему классу (обыкновенное дифференциальное уравнение, ODE, Solver), использовать функцию с этой подписью.

hnext = Miscmath::odeint(&QuintCosmos::propagateHistoryInTau, this);

В методе odeint() он вызывает эту функцию следующим образом.

double Miscmath::odeint(moDerivs derivs, Mathobject* mo)
{
    (mo->*derivs)(x, y, dydx);
}

Не удается скомпилировать в VS C ++ с

ошибка C2664: 'double Miscmath :: odeint (moDerivs, Mathobject *)': невозможно преобразовать аргумент 1 из 'void (__thiscall QuintCosmos :: *) (const double, const double *, double *)' to 'moDerivs'

Первоначальный автор пытался привести указатель функции с помощью (moDerives) следующим образом:

hnext = Miscmath::odeint((moDerivs)&QuintCosmos::propagateHistoryInTau, this);

Это позволяет его компилировать, но во время выполнения происходит сбой с :

Исключение, выданное в 0x001E7148 в cmb-easy.exe: 0xC0000005: Место чтения нарушения доступа 0x0000006 C.

Итак, кто-нибудь знает, как чтобы выполнить sh this: выполнить функцию-член из базы се класс?

...