假设这样一个类:
class Speaker {
public:
void (*saySomething)();
}
关键是我们可以实例化该类并调用存储的函数指针,以使它说点什么(无论结果如何)。这种方法的背景是使实际函数驻留在共享库中,Speaker
充当某种包装器类(函数在库中解析,并且指针分配给该类中的变量) 。
现在考虑我们还有另一个扩展Speaker
的类:
class ConstantSpeaker : public Speaker {
protected:
std::string message;
void doSpeak();
}
具有以下方法的实现:
ConstantSpeaker::doSpeak() {
std::cout << message << std:endl;
}
现在,我想以某种方式分配saySomething
指针,以便将调用以某种方式重新路由到ConstantSpeaker::doSpeak()
。但是,这不可能直接实现,因为doSpeak()
是成员函数,而saySomething
是指向非成员函数的指针。
我的另一个想法是将doSpeak()
创建为ConstantSpeaker
的朋友功能。然后,指针分配可以正常工作,但是现在doSpeak()
将要求持有实际消息的对象作为参数,以便能够访问该消息。
在我看来,似乎应该有一种(或多或少)简单的方法来完成此操作,因为我只能在手握Speaker::saySomething
实例的情况下才能调用Speaker
。因此,相应对象的可用性应该不是问题,但仍然无法弄清楚如何分配该指针。
我唯一能想到的解决方案是添加一个公共virtual Speaker::doSaySomething
函数,该函数的实现将调用该函数指针(为了防止误用,该指针将不再是公共的),并且可以被覆盖ConstantSpeaker
改为呼叫ConstantSpeaker::doSpeak()
。
有解决这个问题的另一种方法吗?
答案 0 :(得分:2)
另一种解决方案是仅使用标准std::function<void()>
,然后仍可以将其声明为public。
此外,您可以使用指向成员函数的指针来代替裸函数指针,但是在基类中使用它时要注意切片。
但是,我认为,最简单的方法就是使用virtual
函数,就像您提到的那样。
也许可以进一步介绍您的情况?您要解决什么问题?