是否可以在没有源代码的情况下从C++库扩展类?标题是否足以允许您使用继承?我正在学习C++并且正在进入理论.我会测试这个,但我不知道怎么做.
简短回答 是的,最终你可以.
答案很长: 警告:以下文字可能会伤害儿童敏感的OOP整体主义者.如果您感觉或保持成为其中之一,请远离这个答案:我的每个人都会更容易生活
让我揭开一个秘密:STL代码只不过是带有头文件和库的常规C++代码,就像你的代码可以 - 而且很可能 - 那样.STL的作者只是程序员,就像你一样.它们在编译器方面并不特别.他没有任何超级大国.他们像你一样坐在他们的厕所上,做你正在做的事情.不要过分误解他们.
STL代码遵循与您自己编写的代码完全相同的规则:被覆盖的内容将被调用而不是基础:总是如果它是虚拟的,并且仅根据其引用指针的静态类型,如果它不是虚拟的,就像其他所有一块C++代码.不多也不少.
重要的是不要破坏关于STL名称约定和语义的设计问题,以便每次进一步使用代码都不会混淆人们的期望,包括你自己,10年后阅读代码,不记得某些决定.
例如,覆盖std::exception::what()必须返回一个解释性持久性C字符串(如STL文档所述),而不是添加意外的其他模糊操作.
此外,重写流或流操作符应该完成整个设计(你真的需要覆盖流或只是streambuffer或只是添加一个特定的facet到它所灌输的语言环境?):换句话说,研究不仅仅是" "但它的所有"世界"的设计,以正确理解它是如何与周围的东西一起工作的.
最后,但并非最不重要的是,最具争议的方面之一是容器和一切没有虚拟析构函数的东西.
我的观点是关于"经典OOP规则:不要导出没有虚拟析构函数"的噪音过度膨胀:根本不要指望a cow成为一个horse因为你放置saddle它.
如果你需要(真的需要)一个用std :: string完全相同的接口来管理一个字符序列的类,它能够隐式转换为std :: string,并且有更多的东西,你有两种方法:
std:string并重写所有112(是的:他们超过100)方法的功能只是打电话给他们,并确保你仍然处女与另一个好男孩程序员的代码结婚, 要么 ...std::string.你唯一要放弃的是你与一个完整主义者结婚的可能性.你甚至可以发现它不一定是个问题:你甚至远离被他杀死的风险!你唯一需要注意的是,如果std::string不是多态的,那么你的推导就会使它成为这样的,所以不要指望std::string*或者std::string&指代yourstring你的方法,包括析构函数,这对其他所有方法都没有特别的尊重; 它只是遵循完全相同的规则.但是......嘿,如果你嵌入并编写一个隐式转换运算符,你将得到完全相同的结果,不会再少了!
规则很简单:不要让自己成为虚拟的析构函数,也不要假装"OOP替换原则"来处理不是为OOP设计的东西,一切都会正确.
随着所有OOP整体主义者在他们永恒的睡眠中保持着自己的睡眠,你的代码将会起作用,而他们仍在重写100+ std :: string方法,只是为了嵌入它.