我需要在一个游戏引擎类中添加一些功能,我可以将其用于VR项目,而不会自行覆盖该类:
引擎类名称为AnnwaynPlayer
,其中包含许多控制播放器的有用方法,现在我处于网络阶段,所以我需要为此lib类添加2个额外的方法{{1 }和setActive()
,最好的方法是什么?
答案 0 :(得分:2)
如果您无法触及类本身,那么您可能希望使用继承。这是面向对象编程的主要目标之一 - 能够在不改变现有类的情况下添加/更改现有类的行为。所以你需要这样的东西:
class MyAnnwaynPlayer : public AnnwaynPlayer {
public:
void setActive();
void setConnected();
// ...
}
现在,如果AnnwaynPlayer
有一个virtual
析构函数,情况会很好。如果它没有并且你的MyAnnwaynPlayer
类有一个非平凡的析构函数,那么你必须警惕通过基类的指针(无论是原始的还是智能的)使用MyAnnwaynPlayer
的实例{ {1}}。当删除类型的指针时,它不会链接到AnnwaynPlayer
析构函数的调用。
答案 1 :(得分:2)
如果您只需要访问基类的公共API,也请考虑ADL。它比继承更安全,因为在实现返回最终未指定的内容(如内部派生类)的情况下,您不一定知道要继承的正确类。
从本质上讲,这看起来像这样:
namespace AnnwaynNamespace {
void setActive(AnnwaynPlayer& p);
void setConnected(AnnwaynPlayer& p);
};
你可以在没有using
这些函数(或命名空间)的情况下调用它们,因为ADL。
void wherever(AnnwaynNamespace::AnnwaynPlayer& p) {
setActive(p);
}
所以setActive
等等,成为该类的实际公共API的一部分,而不涉及任何继承。