Aqu*_*irl 5 c++ virtual-functions callback
考虑一个场景,其中有两个类,即Base和Derived.如果Base类想要调用派生类的函数,它可以通过创建虚函数并在派生类中定义该VF或使用回调来实现.我想知道两者应该优先考虑什么?选择两者取决于哪些情况/条件?
编辑: 问题澄清:
我所指的情况是有一个接收消息的基类.这些不同的消息将由派生类以不同方式处理,因此一种方法是创建虚函数并让派生类实现它,通过各种切换案例处理每条消息.
另一种方法是通过模板内部的函数指针(指向派生类的函数)实现回调(处理派生类的对象和函数名称需要模板).模板和函数指针将驻留在基类中.
虚拟函数调用是实际上是一个回调。
调用者在对象的虚函数表中查找相应的条目并调用它。这与回调的行为完全一样,只是成员函数指针的语法很笨拙。虚拟函数将工作卸载到编译器,这使它们成为一个非常优雅的解决方案。
虚函数是在继承层次结构内进行通信的方式。
我认为这归结为一个决定,即您所谈论的行为是否属于“Base”所了解和子实施的层次结构。
如果您使用回调解决方案,则不必在 Base 的子代中实现回调方法(取决于签名)。例如,如果您想对可能位于派生类中的“事件侦听器”或碰巧对事件感兴趣的完全不相关的类中的“事件侦听器”说“此事件已发生”,这可能是合适的。
如果您采用虚函数解决方案,那么您将更紧密地耦合派生类和基类的实现。
一个有趣的读物,它可能在某种程度上回答你的问题是:C++中的回调,它讨论了 Functors 的用法。维基百科上还有一个使用模板回调进行排序的示例。您会注意到回调(这是一个比较函数)的实现不必在执行排序的对象中。如果它是使用虚拟方法实现的,则情况并非如此。