如上图所示,虚函数指针为啥这么写会报错?
尊敬的会员您好,现在为您解答如下:
先看完整的代码:
#include <iostream>
using namespace std;
class BarData
{
};
class CtaTemplate
{
public:
virtual void on_bar(BarData& bar)
{
cout << "CT"<
};
typedef void (CtaTemplate::*F_on_bar)(BarData&);
class BG
{
public:
F_on_bar on_bar = &CtaTemplate::on_bar;
void update(BarData& bar)
{
CtaTemplate ct;
(*CtaTemplate::on_bar)(bar);
}
};
int main()
{
BG* bg = new BG();
BarData bar;
bg->update(bar);
}
运行输出:CT
分析:
图中报错的代码,在C语言中,用法确实没有错。但是,我们这里定义的是类函数的指针,所以不能直接按照C语言的用法。
原因在于,C++的类函数指针和C语言的函数指针有着本质的区别。此处的类函数指针是运行时的对象的函数。因为CtaTemplate::on_bar定义的是虚函数,非静态函数。如果是静态函数,用法就和C语言的函数指针类似了,只不过需要指定类名。你可以尝试用类静态函数指针来使用一下。
而类函数指针需要先创建一个对象,即CtaTemplate ct。然后在用对象点出来这个指针,再用*取出类函数指针指向的函数,这样完成函数调用。