如何在不重写 lib 类的情况下将函数添加到它
how to add a function to a lib class without overriding it
我有一个情况,我需要向用于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 的一部分,而不涉及任何继承。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 在这种情况下,java对象是否可以调用本机函数
- 这个c++代码是如何在没有定义函数的情况下运行的
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- A类的定义需要B类的定义,如何在不公开B的定义的情况下公开A的公共函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- C++ strcpy 函数在少数主要情况下失败
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何在没有复制构造函数的情况下为地图设置值?
- 在这种情况下,如何传递成员函数而不是函数?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 在没有默认构造函数的情况下创建的派生对象
- 在双重继承的情况下如何处理非标准构造函数