C++;,如何从基类调用派生成员函数? 原始程序员有这样的想法,不管他用的是什么编译器,但是在VC++中都不怎么好。这种做法在我看来很可疑

C++;,如何从基类调用派生成员函数? 原始程序员有这样的想法,不管他用的是什么编译器,但是在VC++中都不怎么好。这种做法在我看来很可疑,c++,member-function-pointers,C++,Member Function Pointers,他有一个名为mathObject的通用基类,它有很多常用的数学函数。除此之外,他还有一门课叫Cosmos,除此之外,还有一门课叫QuintCosmos 一般的想法是,他想从Mathobject或Cosmos或QuintCosmos调用具有相同签名的成员函数。他想把它扔给我 typedef void (Mathobject::*moDerivs) (const double, const double*, double*) 所以,概括地说,他可以在这个层次结构中的任何地方有这个签名的函数,他想告

他有一个名为
mathObject
的通用基类,它有很多常用的数学函数。除此之外,他还有一门课叫
Cosmos
,除此之外,还有一门课叫
QuintCosmos

一般的想法是,他想从
Mathobject
Cosmos
QuintCosmos
调用具有相同签名的成员函数。他想把它扔给我

typedef void (Mathobject::*moDerivs) (const double, const double*, double*)
所以,概括地说,他可以在这个层次结构中的任何地方有这个签名的函数,他想告诉第三类(常微分方程,ODE,解算器)使用这个签名的函数

hnext = Miscmath::odeint(&QuintCosmos::propagateHistoryInTau, this);
odeint()
方法中,他这样调用这个函数

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

这在VC++中没有用

编译 错误C2664:“double Mismath::odeint(moDerivs,Mathobject*)”:无法将参数1从“void(\uu thiscall QuintCosmos::*)(常数双精度,常数双精度*,双精度*)”转换为“moDerivs”

最初的作者试图用
(Moderalives)
如下方式转换函数指针:

hnext = Miscmath::odeint((moDerivs)&QuintCosmos::propagateHistoryInTau, this);
这允许它进行编译,但在运行时失败,原因是:

cmb-easy.exe中0x001E7148处引发异常:0xC0000005:访问冲突读取位置0x0000006C


所以,归根结底,有人知道如何做到这一点:从基类执行成员函数吗?

我建议从阅读
虚拟
函数开始。这可能是一个愚蠢的问题,但为什么要这样做?如果你在使用继承,那么…使用它<代码>虚拟函数的存在是有原因的。@KamilCuk-记住,这不是我写的。我正在尝试移植一个巨大的图书馆。我无法调用静态函数,因为此函数有时会使用成员字段。您是否可以使用
g++
clang++
组合一个函数,但使用MSVC会出现该错误?很难猜测它应该如何工作。@Quarkly:那么调用(对象的动态类型)实际上没有的成员函数就是未定义的行为。指向成员函数的指针通常很复杂,因此实现之间的行为不同并不奇怪。我建议从阅读
virtual
函数开始。这可能是一个愚蠢的问题,但为什么这样做呢?如果你在使用继承,那么…使用它<代码>虚拟函数的存在是有原因的。@KamilCuk-记住,这不是我写的。我正在尝试移植一个巨大的图书馆。我无法调用静态函数,因为此函数有时会使用成员字段。您是否可以使用
g++
clang++
组合一个函数,但使用MSVC会出现该错误?很难猜测它应该如何工作。@Quarkly:那么调用(对象的动态类型)实际上没有的成员函数就是未定义的行为。指向成员函数的指针通常是复杂的,因此实现之间的行为不同也就不足为奇了。