是否可以在没有源代码的情况下从 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 程序员的代码结婚,或者... std::string
.你唯一会失去的就是你有可能嫁给一个完整的人。你甚至可以发现这不一定是问题:你甚至远离了被他杀死的风险! 你唯一需要注意的是,被
std::string
不是多态的,你的推导不会如此,所以不要指望和 std::string*
或 std::string&
引用 yourstring
调用你的方法,包括析构函数,这对其他方法没有特别的尊重;它只是遵循完全相同的规则。但是...嘿,如果您嵌入并编写一个隐式转换运算符,您将得到完全相同的结果,不多不少!
规则很简单:不要让自己的析构函数成为虚拟的,也不要假装“OOP 替换原则”来处理不是为 OOP 设计的东西,一切都会好起来的。
由于所有的 OOP 积分主义者都要求他们永远沉睡,您的代码将可以工作,而他们仍在重写 100 多个 std::string 方法只是为了嵌入它。
关于c++ - 在 C++ 中扩展库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11201321/