【发布时间】:2018-11-09 02:39:18
【问题描述】:
在讨论什么是好的 C++ 时被吹捧的一句话是“你只需为你使用的东西付费”。我听说这被用作不使用继承/多态构造和对接口进行编码的想法的理由,因为这些构造将需要在运行时使用 v-table 来处理编译时已知的东西.
这是真的吗?基本的 OOP 是否违反了 C++ 的主要原则(特别是“编码到接口”的想法是否打破了“您只需为使用的东西付费”的想法?
【问题讨论】:
-
多态应该用于编译时类型未知的情况(例如,当对象类型可以通过用户输入选择时)
-
按照短语,如果使用,您只需为多态性付费。如果您不使用“虚拟”,则无需为此付费。如果在编译时可以静态知道所有类型,则您不需要多态性,因此请不要使用它,也不会为此付费。 C++ 并非旨在阻止您使用您并不真正需要的东西。如果您使用不需要的东西,您仍然需要付费。
-
请注意,继承和 OOP 不是一回事。您可以使用一个而不使用另一个。您可以拥有不使用继承的对象,并且可以将继承用于非 OOP 目的,例如模板元编程。
-
继承是当然 OO 的一部分,除其他外,还可以用于设计继承类使用的接口。类似地,多态只是使用继承实例并将其传递给父类而不需要更改接口的术语。所有这些都是程序设计和全局问题,完全与语言无关。多态性和用户输入之间没有关系。实现多态的程序甚至可能没有用户输入!
-
话虽如此,继承在大多数情况下是一个被高估的 OO 特性,应该谨慎使用。由于在第一个程序设计阶段,即使是资深设计师也很难预测未来程序扩展过程中类的发展需求。如果不允许维护人员返回并更改原始界面,这种布局的界面通常会变得繁琐和负担。同样,继承非为继承而设计的类的维护者可能会造成各种陷阱。