如何在不覆盖的情况下将函数添加到库 class

how to add a function to a lib class without overriding it

我有一个案例,我需要向游戏引擎添加一些功能class我正在使用 VR 项目而不覆盖 class 它自己:

引擎 class 名称是 AnnwaynPlayer 包含许多有用的方法来控制播放器,现在我处于联网阶段所以我需要向这个库添加 2 个额外的方法 class 即 setActive()setConnected(),最好的方法是什么?

如果您不能触及 class 本身,那么您可能想要使用继承。这是面向对象编程的主要目标之一——能够 add/change 现有 class 的行为而不改变它。所以你想要这样的东西:

class MyAnnwaynPlayer : public AnnwaynPlayer {
public:
    void setActive();
    void setConnected();
    // ...
}

现在,如果 AnnwaynPlayer 有一个 virtual 析构函数就没问题了。如果它没有并且你的 MyAnnwaynPlayer class 有一个非平凡的析构函数那么你必须警惕通过 base 的指针(无论是原始的还是智能的)使用 MyAnnwaynPlayer 的实例classAnnwaynPlayer。当删除该类型的指针时,它不会通过对 MyAnnwaynPlayer 析构函数的调用进行链接。

如果您只需要访问基础 class 的 public API,也可以考虑 ADL。它比继承更安全,因为在实现 returns 最终未指定的东西(如内部派生 class)的情况下,您不一定知道继承的权利 class。

本质上,这看起来像这样:

namespace AnnwaynNamespace {
void setActive(AnnwaynPlayer& p);
void setConnected(AnnwaynPlayer& p);
};

并且您可以在没有 using 那些函数(或名称空间)的情况下调用它们,因为 ADL。

void wherever(AnnwaynNamespace::AnnwaynPlayer& p) {
    setActive(p);
}

因此 setActive 等成为 class 的实际 public API 的一部分,而不涉及任何继承。