在讨论中有关C ++的外观的一句名言是“您只为使用的东西付费”。我听说这被用作不使用继承/多态结构的理由以及对接口进行编码的想法,因为这些结构将需要在运行时使用v-table进行编译时已知的操作
这是真的吗?基本的OOP是否会破坏C ++的主要宗旨(特别是“编码为接口”的思想是否会破坏“您只为使用的内容付费”的思想?
答案 0 :(得分:2)
使用正确的工具完成正确的工作。
当在编译时无法知道某个对象的确切类型时,v表很有用。如果这适用于您的程序,则您需要付费使用。如果不适用,那么有一些方法可以实现安全的多态性而无需引入v表(不使用虚拟函数;将基类的析构函数进行保护)。
这里没有内在的矛盾,但是需要了解所使用的工具。使用次优工具并最终付出比您所用更多的钱并不难。 (关于算法,您可能会说同样的话-使用次优算法并最终花费比您所需更多的时间/空间并不难。这不是语言的错。)
答案 1 :(得分:-1)
C ++多态性/对象模型是添加到语言中的第一批内容之一,并且是在采用该惯用法之前添加的。
这是一个特定的对象模型,具有一定的权衡,优点和缺点。它的变化将允许其他折衷;例如在运行时添加类型,基于对象替换方法,稀疏vtable等,甚至从实例中拆分vtable(这样您就可以更有效地打包相同类型的数组)。
是的,使用vtables和rtti时,您可以轻松支付未使用的功能的费用。替代模型可以节省资源/时间/等,或允许替代解决方案。
从正面看,元类可以允许重写接口/实现几乎是任意对象模型的变体。