提供基类的成员函数

时间:2015-01-22 13:15:24

标签: c++

考虑以下代码:

class Logic {
};

class InheritedLogic : public Logic {
    void someMember();
};

void setHandler(void (Logic::*h)(void));

setHandler(InheritedLogic::someMember);

这不能编译,因为:

  

错误16错误C2664:[..]无法将参数2从'void(__ thishisall InheritedLogic :: *)(void)'转换为'void(__ thiscall Logic :: *)(void)'[..]

我会说InheritedLogic::someMember属于Logic::*()类型,但显然不是。

我该如何使这项工作?我正在寻找一种方法来将Logic类的成员提供给另一个不知道任何可能的继承的类,这样我就可以灵活地使用我可以附加的逻辑处理程序。

3 个答案:

答案 0 :(得分:2)

std/boost ::functionstd/boost:: bind一起使用。

void setHandler(const std::function<void()>);

setHandler(std::bind(&InheritedLogic::someMember, &object));

答案 1 :(得分:1)

你可以简单地尝试模板:

template <class T>
setHandler(void(*T::pFunction)(void))

现在进行实例化:

setHandler<InheritedLogic>(InheritedLogic::someMember)

答案 2 :(得分:1)

成员函数继承反过来。

struct Logic {
};

struct InheritedLogic : Logic {
    void someMember();
};

struct MoreInheritedLogic :  InheritedLogic {
};

void setHandler(void (MoreInheritedLogic::*h)(void));

int main () {
setHandler(&InheritedLogic::someMember);
}

这个编译。你的代码没有,因为继承的方式是错误的。

要理解为什么,想象一下你的代码是有效的,并试着在精神上重现如果你打电话会发生什么

Logic* l;
l->*h();

如果问题尚不清楚,请将数据成员添加到InheritedLogic并让someMember()访问它。