【问题标题】:You Only Pay For What You Use vs. Inheritance [closed]您只需为您使用的东西与继承付费[关闭]
【发布时间】:2018-11-09 02:39:18
【问题描述】:

在讨论什么是好的 C++ 时被吹捧的一句话是“你只需为你使用的东西付费”。我听说这被用作使用继承/多态构造和对接口进行编码的想法的理由,因为这些构造将需要在运行时使用 v-table 来处理编译时已知的东西.

这是真的吗?基本的 OOP 是否违反了 C++ 的主要原则(特别是“编码到接口”的想法是否打破了“您只需为使用的东西付费”的想法?

【问题讨论】:

  • 多态应该用于编译时类型未知的情况(例如,当对象类型可以通过用户输入选择时)
  • 按照短语,如果使用,您只需为多态性付费。如果您不使用“虚拟”,则无需为此付费。如果在编译时可以静态知道所有类型,则您不需要多态性,因此请不要使用它,也不会为此付费。 C++ 并非旨在阻止您使用您并不真正需要的东西。如果您使用不需要的东西,您仍然需要付费。
  • 请注意,继承和 OOP 不是一回事。您可以使用一个而不使用另一个。您可以拥有不使用继承的对象,并且可以将继承用于非 OOP 目的,例如模板元编程。
  • 继承是​​当然 OO 的一部分,除其他外,还可以用于设计继承类使用的接口。类似地,多态只是使用继承实例并将其传递给父类而不需要更改接口的术语。所有这些都是程序设计和全局问题,完全与语言无关。多态性和用户输入之间没有关系。实现多态的程序甚至可能没有用户输入!
  • 话虽如此,继承在大多数情况下是一个被高估的 OO 特性,应该谨慎使用。由于在第一个程序设计阶段,即使是资深设计师也很难预测未来程序扩展过程中类的发展需求。如果不允许维护人员返回并更改原始界面,这种布局的界面通常会变得繁琐和负担。同样,继承非为继承而设计的类的维护者可能会造成各种陷阱。

标签: c++ interface vtable


【解决方案1】:

为正确的工作使用正确的工具。

当在编译时无法知道某个对象的确切类型时,v-table 很有用。如果这适用于你的程序,那么你就是为你使用的东西付费。如果它不适用,那么有一些方法可以在不引入 v-table 的情况下实现安全多态性(不使用虚函数;使基类析构函数受到保护)。

这里没有内在的矛盾,但需要了解所使用的工具。使用次优工具并最终支付比您使用的更多的费用并不难。 (你可以对算法说同样的话——使用次优算法并最终使用比你需要的更多的时间/空间并不难。这不是语言的错。)

【讨论】:

  • 我主要来自 C#,在 C# 中实现轻松单元测试的一种重要方法是编写接口代码。是否有 C++ 等价物,以便我可以使用正确的工具来完成正确的工作(在本例中为测试)?
  • @tjcertified 这似乎是一个要发布的新问题
【解决方案2】:

C++ 多态性/对象模型是最早添加到该语言中的东西之一,它是在采用该惯用语之前添加的。

它是一种特定的对象模型,具有一定的取舍、优点和缺点。它的变化将允许其他权衡;例如在运行时添加类型、基于每个对象替换方法、稀疏 vtable 等。甚至可以从实例中拆分 vtable(这样您就可以更有效地拥有相同类型的打包数组)。

所以是的,当您使用 vtables 和 rtti 时,您可以轻松地为未使用的功能付费。替代模型可以节省资源/时间/等,或允许替代解决方案。

从好的方面来说,元类可以允许重写接口/实现几乎是任意的对象模型变化。

【讨论】:

  • 什么是 kt,如您在上面的回答中所使用的那样?
  • @tjce 错字,已修复
猜你喜欢
  • 2011-02-02
  • 2011-06-20
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多