c++ - 在 C++ 中扩展库

标签 c++ inheritance

是否可以在没有源代码的情况下从 C++ 库扩展类?拥有标题就足以让您使用继承吗?我只是在学习 C++ 并且正在进入理论。我会测试这个,但我不知道如何。

最佳答案

简答
是的,绝对可以。

长答案 :
警告:以下文字可能会伤害敏感的 OOP 积分主义者。如果你觉得或仍然是这样的人,请远离这个答案:我的你和每个人的生活都会更轻松

让我透露一个 secret :STL 代码只不过是带有头文件和库的常规 C++ 代码,就像您的代码可以(而且很可能)一样。
STL 作者只是像你一样的程序员。它们对编译器没有任何特别之处。对它没有任何超能力。他们坐在马桶上就像你坐在你的马桶上一样,做你做的事情。不要过度混淆它们。

STL 代码遵循与您自己编写的代码完全相同的规则:被覆盖的将被调用而不是基:如果它是虚拟的,则始终调用,如果它不是虚拟的,则仅根据其引用指针的静态类型,就像其他所有代码一样一段 C++ 代码。不多不少。

重要的是不要破坏尊重 STL 命名约定和语义的设计问题,这样你的代码的每一次进一步使用都不会混淆人们的期望,包括你自己,在 10 年后阅读你的代码,不再记住某些决定。

例如,覆盖 std::exception::what()必须返回一个解释性的持久 C 字符串,(如 STL 文档所说)并且不添加意外的其他模糊操作。

此外,覆盖流或流操作符应该考虑整个设计(你真的需要覆盖流或只覆盖流缓冲区,还是只需要向它灌输的语言环境添加一个特定的方面?):换句话说,研究不仅仅是“class”,而是设计其所有“世界”以正确理解它如何与周围事物一起工作。

最后但并非最不重要的一点是,最有争议的方面之一是容器和所有没有虚拟析构函数的东西。

我的观点是关于“经典的 OOP 规则:不要派生没有虚拟析构函数的东西”的噪音被夸大了:根本不要指望 cow成为horse只是因为您放置了 saddle在上面。

如果你需要(真的真的需要)一个管理字符序列的类,它具有与 std::string 完全相同的接口(interface),能够隐式转换为 std::string 并且还有更多的东西,你有两种方法:

  • 做好女孩做的事,嵌入std:string并用函数重写所有 112 个(是的:它们超过 100 个)方法,这些方法只做调用它们的工作,并确保您仍然与另一个好 child 程序员的代码结婚,或者...
  • 在发现这需要大约 30 年之后,您有可能成为 40 岁。处女不再是好 child ,程序员不再感兴趣,更实际一点,牺牲你的贞操,推导出std::string .你唯一会失去的就是你有可能嫁给一个完整的人。你甚至可以发现这不一定是问题:你甚至远离了被他杀死的风险!

  • 你唯一需要注意的是,被 std::string不是多态的,你的推导不会如此,所以不要指望和 std::string*std::string&引用 yourstring调用你的方法,包括析构函数,这对其他方法没有特别的尊重;它只是遵循完全相同的规则。
    但是...嘿,如果您嵌入并编写一个隐式转换运算符,您将得到完全相同的结果,不多不少!

    规则很简单:不要让自己的析构函数成为虚拟的,也不要假装“OOP 替换原则”来处理不是为 OOP 设计的东西,一切都会好起来的。

    由于所有的 OOP 积分主义者都要求他们永远沉睡,您的代码将可以工作,而他们仍在重写 100 多个 std::string 方法只是为了嵌入它。

    关于c++ - 在 C++ 中扩展库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11201321/

    相关文章:

    c++ - Cpp线程对象和shared_ptr问题

    c++ - 何时使用 std::invoke 而不是简单地调用可调用对象?

    C++ ifstream::read 混淆

    python - 为什么我的 python 子类无法识别父类(super class)的属性?

    c++ - dynamic_cast 和多态性

    c++ - Ada 数字代码未通过隐藏测试

    c++ - 尝试将字符串变量转换为 bool 结果 "true"和 "false"都等于 0

    c++ - 继承特化的模板参数推导

    c++ - 通过继承而非组合锁定

    c# - 确保调用基类的静态构造函数的最佳方法是什么?