为什么我们不能在C ++中覆盖函数指针?

时间:2017-03-08 03:05:28

标签: c++ function pointers

我想创建一个成员回调变量而不是可以接受多个参数:

class Polygon : public Shape {
    protected:
        void (*onClick)( Polygon * );
        void (*onClick)( Point * );
        void (*onClick)();
    ...
}

当然这段代码会抛出错误。有什么特别的理由说明我不能或不应该这样做吗?还有替代品吗?对于相同的行为,我不想要三个不同的名字。

2 个答案:

答案 0 :(得分:4)

Tl;博士:因为标准不允许你这样做。

使用"同名的不同行为"

,只能在函数指针过载的情况下使用函数重载(或在某种程度上使用模板)。

为了保持onClick的相同名称,您必须求助于重载:

 #include <functional>

 class Polygon : public Shape {
 private:
     std::function<void(Polygon*)> _poly_f;
     std::function<void(Point*)> _point_f;
     std::function<void()> _empty_f;
 protected:
    void onClick(Polygon* p) { _poly_f(p); }
    void onClick(Point* p) { _point_f(p); }
    void onClick() { _empty_f(); }
    ...
}

答案 1 :(得分:1)

您在这里声明变量。两个变量不能有相同的名称。