C++ Virtual 关键字作为一种避免包含代码单元的方法

标签 c++ virtual late-binding dlopen

目前我们有一组代码允许服务插件提供与核心通信的形式,例如 tcp/ip、udp/ip、usb 等...这些服务插件将通知类实例反馈给核心以进行进一步处理.

在当前的实现中,一个服务项目(它是一个单独的动态链接库,由内核通过 dlopen 和 friend 在运行时引入)将针对驻留在核心源代码(一个单独的项目)中的 notifier.cpp 文件进行编译.这允许访问通知程序方法实现。这非常有效,没有任何提示。

两个备选方案: 1.将通知方法实现放在头文件中。 2. 将通知方法声明为虚拟的,并将绑定(bind)延迟到运行时。

避免计算开销问题选项 2 的影响是什么?

我们还有其他选择吗?

谢谢

最佳答案

是的,向消费者公开带有纯虚函数的接口(interface)是从 Windows DLL 公开 C++ 对象的标准方式。客户端不知道任何实现细节:没有成员变量,没有成员函数体,只有虚拟布局。

(添加引用计数和与语言无关的 dynamic_cast 版本,我们将其称为 QueryInterface,并且您拥有在 Windows 上无处不在的 COM)

此技术也适用于 *nix 共享库。

关于C++ Virtual 关键字作为一种避免包含代码单元的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631329/

相关文章:

c++ - 多级/多继承期间对象的大小

c++ - 在类声明中使用 virtual 关键字

c++ - 虚拟类问题

c++ - 在不同项目(没有编译时链接)中使用的 header 中声明的纯抽象 C++ 类是否共享相同的虚拟表模型?

c++ - 使用带有模板基类的类作为基类参数

c++ - 包含 vector 的指针列表的内存管理

c++ - 如何确定编译器是对虚函数使用早期绑定(bind)还是后期绑定(bind)?

c - 我想在 C 中为二维数组创建一个通用选择器

c++ - 从一副牌发牌(不重复的牌)

c++ - OpenSSL ssl_accept() 错误 5