C++虚函数指针的使用

336 人浏览 | 时间: 2022-03-30 19:00:00 | 作者: thvoifar

如上图所示,虚函数指针为啥这么写会报错?

尊敬的会员您好,现在为您解答如下:
先看完整的代码:

#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);
}

gcc编译生成:gcc -o test test.cpp -lstdc++ -std=c++11
运行输出:CT

分析:
图中报错的代码,在C语言中,用法确实没有错。但是,我们这里定义的是类函数的指针,所以不能直接按照C语言的用法。
原因在于,C++的类函数指针和C语言的函数指针有着本质的区别。此处的类函数指针是运行时的对象的函数。因为CtaTemplate::on_bar定义的是虚函数,非静态函数。如果是静态函数,用法就和C语言的函数指针类似了,只不过需要指定类名。你可以尝试用类静态函数指针来使用一下。
而类函数指针需要先创建一个对象,即CtaTemplate ct。然后在用对象点出来这个指针,再用*取出类函数指针指向的函数,这样完成函数调用。

标注
评论
站内搜
百度搜
传送到手机
手机扫码,识别文字,完成传送x
加载中...
标注内容x
加载中...
添加标注x
收藏 0 点赞 1

相关阅读