gpt4 book ai didi

c++ - 如何使指针指向派生类的成员函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:34:20 25 4
gpt4 key购买 nike

我需要在基类中有一个函数指针数组,并将这个数组定义为指向子类中的函数,如下所示:

typedef double (_f)(int,int);
class A{
public:
_f **m_arf;
};

class B:public A{
public:
double get1(int i, int j) {return i+j};
double get2(int i, int j) {return i-j};
B(){
m_arf = new _f*[2];
m_arf[0] = &get1;
m_arf[1] = &get2;
};
};

然后我可以执行以下操作:

{
A* pA = new B;
int ires = pA->m_arf[0](1,2); // returns B::get1(1,2)
int ires1 = pA->m_arf[1](1,2); // returns B::get2(1,2)
}

这可能吗?

最佳答案

指针:

typedef double (_f)(int,int);

不/不能指向一个成员函数。它只能指向一个自由函数。因此您尝试做的事情永远不会按照您尝试的方式工作。

声明一个成员函数指针,语法不同:

typedef double (A::*_f)(int,int);

此外,你还必须使用不同语法的指针:你必须引用类。

_f = &B::get1; // not &get1

但是,现在你会遇到另一个问题,那就是get1不是 A 的成员, 但属于 B 的成员.为了将指向派生类成员的指针分配给指向基类成员的指针,必须使用static_cast。 :

m_arf[0] = static_cast <A::Fn> (&B::get1);

最后,通过这个指针实际调用的语法也是不同的。您不能直接通过指针调用——您还必须将调用与类的实例相关联。 ->*语法将类实例连接到函数指针:

int ires = (pA->*(pA->m_arf [0])) (1,2);

哎呀,真是一团糟。除非确实需要,否则最好不要以这种方式使用成员函数指针。无论如何,这里有一个演示如何完成。

class A{
public:
typedef double (A::*Fn) (int, int);
Fn *m_arf;
};

class B:public A{
public:
double get1(int i, int j)
{
return i+j;
};
double get2(int i, int j)
{
return i-j;
};
B(){
m_arf = new Fn[2];
m_arf[0] = static_cast <A::Fn> (&B::get1);
m_arf[1] = static_cast <A::Fn> (&B::get2);
};
};

int main()
{
A* pA = new B;
int ires = (pA->*(pA->m_arf [0])) (1,2); // returns B::get1(1,2)
int ires1 = (pA->*(pA->m_arf[1])) (1,2); // returns B::get2(1,2)
}

关于c++ - 如何使指针指向派生类的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23410750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com