c++ - 如果基类和派生类都需要使用相同的函数,回调函数应该去哪里?

标签 c++ inheritance callback

假设我有一个继承自 Parent 类的 Child 类。这两个类都需要能够将同一方法的函数指针发送给 API,我们称它为 foo()。

我不认为我可以使 foo() 成为成员函数,因为调用回调的进程需要有一个 Child 或 Parent 的对象来调用它。我也不认为我可以使 foo() 成为静态成员函数,因为可能有多个 Parent of Child 实例。

在这种情况下,放置 foo() 的最干净的地方是什么?它是否应该进入自己的文件并拥有自己的命名空间,并将#include 包含在父子对象中? foo() 是否应该仅在 Parent 中意味着 Child 需要包含 Parent.cpp 并转发声明 foo()?

感谢任何见解!

最佳答案

如果您的 API 需要一个指向函数的指针,您只能给它一个静态函数或在任何类之外定义的普通函数。如果您稍后需要此函数调用您的一个对象上的方法,您需要 API 允许您传递一些东西(通常是一个void *)。如果您可以向 API 传递函数指针一个void *,您就赢了:只需向它传递一个指向 Parent 或 Child 类对象的指针以及指向中继功能。

假设 API 将调用 int (*callback)(void *param/* other params...*/)

您定义如下内容:

int myCallback(void* param /* other params...*/) {
    Parent *parent = static_cast<Parent *>(param);
    return parent->myMethod(/* other params...*/);
}

那样:

  • API 只知道指向函数的普通指针和不透明的 void *
  • 您可以在您的类中声明普通方法(甚至虚方法)
  • relay 函数由 API 调用,然后调用对象的方法

关于c++ - 如果基类和派生类都需要使用相同的函数,回调函数应该去哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32837122/

相关文章:

C#如何触发回调?

c++ - 使用参数绑定(bind)通用回调 c++11

c++ - 转换重载函数不明确

c# - 从基类对象列表中识别派生类型

c++ - 通过继承扩展 C++ 标准库?

c++ - 不直接继承的基模板类成员的可见性

c++ - 为什么我调用mem_fun_ref会有 "no matching function"?

language-agnostic - 什么是回调方法?

c++ - 使用iterator和reverse_iterator打印 vector 元素有没有更好的方法?

c++ - 解析 C/C++ 源代码 : How are token boundaries/interactions specified in lex/yacc?