3

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

4

4 回答 4

7

简短的回答 是的,绝对可以。

长答案警告:以下文字可能会伤害敏感的 OOP 积分主义者的孩子。如果您觉得或保持成为其中之一,请远离这个答案:我的你和每个人的生活都会更轻松

让我透露一个秘密:STL 代码只不过是带有头文件和库的常规 C++ 代码,就像您的代码可以 - 并且很可能 - 一样。STL 作者只是像你一样的程序员。它们对于编译器来说并没有什么特别之处。他们对此没有任何超能力。他们坐在他们的马桶上,就像你坐在你的马桶上一样,完全按照你的方式做。不要过度混淆它们。

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

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

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

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

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

我的观点是,关于“经典的 OOP 规则:不要'派生没有虚拟析构函数的东西”的噪音被夸大了:不要指望 acow成为 ahorse只是因为你saddle在它上面放了 a 。

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

  • 做好女孩所做的事情,嵌入std:string并重写其所有 112 个(是的:它们超过 100 个)方法,其功能只不过是调用它们,并确保您与另一个好男孩程序员的代码仍然处女结婚, 或者 ...
  • 发现这需要大约 30 年的时间,你冒着成为 40 岁处女的风险,没有好的好男孩程序员不再感兴趣,更加实际,牺牲你的童贞并衍生std::string。你唯一会失去的是你嫁给一个整合主义者的可能性。而且你甚至可以发现这不一定是问题:你甚至远离被他杀死的风险!

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

规则很简单:不要让自己成为虚拟的析构函数,也不要假装“OOP 替换原则”可以使用不是为 OOP 设计的东西,一切都会顺利进行。

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

于 2012-06-26T07:13:27.920 回答
4

是的,类的声明足以从中派生。

当您链接到库时,将获取其余代码。

于 2012-06-26T05:50:07.453 回答
2

是的,您可以在标准 C++ 库中扩展类。头文件就足够了。

一些例子:

  • 扩展std::exception类以创建自定义异常
  • 扩展流库以在您的应用程序中创建自定义流

但是您应该注意的一件事是不要扩展没有virtual destructor. 例子是std::vectorstd::string

编辑:我刚刚发现另一个关于这个主题的 SO 问题通过继承扩展 C++ 标准库?

于 2012-06-26T05:50:46.600 回答
1

只要有一个头文件就足以从该类继承。
C++ 程序分两个阶段构建:

  • 编译
    编译器查找类型的定义并检查程序的语言正确性。这会生成目标文件。
  • 链接
    编译的目标文件链接在一起形成一个可执行文件。

因此,只要您拥有头文件(编译所需)和库(链接所需),您就可以从类派生。
但请注意,必须小心该类是否确实是为了继承。
例如:如果您有一个具有非virtual析构函数的类,则该类不适合继承。就像所有标准库容器类一样。

所以简而言之,只要有一个类的接口就足以进行派生,但类的实现和设计语义确实起着重要作用。

于 2012-06-26T05:53:44.150 回答