如何在不覆盖的情况下将函数添加到库 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 的一部分,而不涉及任何继承。
我有一个案例,我需要向游戏引擎添加一些功能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 的一部分,而不涉及任何继承。