如何在不覆盖它的情况下将函数添加到lib类中

时间:2016-01-29 11:08:12

标签: c++ override

我需要在一个游戏引擎类中添加一些功能,我可以将其用于VR项目,而不会自行覆盖该类:

引擎类名称为AnnwaynPlayer,其中包含许多控制播放器的有用方法,现在我处于网络阶段,所以我需要为此lib类添加2个额外的方法{{1 }和setActive(),最好的方法是什么?

2 个答案:

答案 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的一部分,而不涉及任何继承。