c++中的函数指针和类成员函数指针

来源:互联网 发布:电机软件控制工程师 编辑:程序博客网 时间:2024/06/15 03:57

       在c中函数指针的形式很简单 函数返回type+(*函数名)+参数,为了使用方便我们经常通过typedef来重新定义,下面来看一个例子。

       这里我们需要注意到一点,前两个函数我没有用取址符,后两个函数我用了取址符有什么不同呢,这里我们可以类比一下数组,int a[10],当我们取a和&a的值时其实是一样的,都是数组的首地址,对于函数来说这两种写法值也是一样的,但是其意义会有所不同,test表示的是函数的首地址,类型是void()类型,而&test是一个指向函数的指针类型是int (*)(int,int)

在c++普通的函数指针是一样的,如果是类的成员函数指针呢?

当遇到c++的类成员函数时会有很大的不同,首先声明函数指针式必须加上类名,其次在使用时会有很大的区别,最明显的就是在赋值时我们必须加上取址符。
执行结果第一眼看上去其实是一脸懵逼,我们来分析一下。
首先看第一组打印,我们用父类的test函数初始化func1,然后分别通过父类和子类调用该函数,结果都调用了父类的函数,在看到结果前认为第二个会调用子类的test'函数,结果我错了,这里应该是通过子类调用父类的函数(类比MYClass::test,java中的super),但是第二组就不同了,因为sing是一个虚函数当你通过父类和子类对象调用时分别调用了自己的函数,由此可见函数指针也是支持多态的。
接着我们看注释掉的两句,这里是不允许的,如果你想把一个父类成员函数指针指向子类的函数,这个函数不能是在子类中重写父类的函数,因为通过父类不能访问到子类的成员,但是反过来就可以。
看第三组,我们分别用父类和子类的成员函数初始化了子类的成员函数指针,这里是允许的,因为我们可以通过子类访问父类的成员,此时相对应的调用了父类和子类的成员函数。到第四组我们看到和第三组又不同了,这里之所以都调用了子类的函数是因为多态导致的,因为我们通过子类对象调用了该函数,并且该函数是虚函数。
第五组是一个通过父类成员函数指针指向子类成员函数,此时因为我们在子类中没有重写父类的该函数所以是允许的,但是如果我们在子类中重写了该函数那么这里是不允许的。
第六组是一个类成员静态函数的用法,此时静态类成员类成员函数的函数指针声明方式跟普通函数是一样的,但是使用时是和类成员函数的用法。
最后还有一点我们要注意,一个父类成员函数指针,在调用函数式我们可以过父类和子类对象来调用,但是一个子类成员函数指针我们只能通过子类对象来调用。

0 0