如何在不重写 lib 类的情况下将函数添加到它

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

本文关键字:情况下 函数 添加 重写 lib      更新时间:2023-10-16

我有一个情况,我需要向用于VR项目的游戏引擎类添加一些函数,而不覆盖它本身的类:

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

如果你不能碰类本身,那么你可能想使用继承。 这是面向对象编程的主要目标之一 - 能够在不更改现有类的情况下添加/更改其行为。 所以你想要这样的东西:

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

现在,如果AnnwaynPlayer有一个virtual析构函数,一切都会好起来的。 如果没有,并且您的MyAnnwaynPlayer类具有非平凡的析构函数,那么您必须警惕通过基类AnnwaynPlayer的指针(无论是原始的还是智能的)使用MyAnnwaynPlayer实例。 删除该类型的指针时,它不会通过对MyAnnwaynPlayer析构函数的调用进行链接。

如果只需要访问基类的公共 API,请考虑使用 ADL。它比继承更安全,因为在实现返回最终未指定的内容(如内部派生类)的情况下,您不一定知道要从哪个类继承的正确类。

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

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

您可以在不using这些函数(或命名空间)的情况下调用它们,因为 ADL.

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

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

相关文章: