3

在最近的一次开发者会议上,简要讨论了 Swift中的继承struct(或者更准确地说是 Swift 中缺乏继承)的主题。struct我假设 Swift 不支持struct继承的原因是:

  • structs 是值类型
  • 值类型在堆栈帧之间复制
  • 继承意味着 a 的大小struct可能会有所不同(例如,如果Lorry继承自VehicleLorry添加.weightCapacitythenLorry将需要比 更多的空间Vehicle
  • 具有大小在编译时未知的值类型参数会使调用者的堆栈帧构造和访问被调用者的数据复杂化

我认为正是由于这些复杂性,可能会给每个涉及 a 的函数调用添加额外的操作,struct从而降低性能,Swift 不允许struct继承。这个推理正确吗?

但后来我想到了 C++。C++ 确实允许struct继承,并且 C++ 非常注重性能。这让我觉得我对 Swift 不允许struct继承的推理是错误的。C++ 如何在struct不影响性能的情况下实现继承?

4

2 回答 2

4

C++ 如何在不影响性能的情况下实现结构继承?

在 C++ 中,编译器总是知道struct. 但是当一个基类按值复制时,对象被“切片”:只有基类的成员被复制,新对象与原始对象的派生类没有任何关系。

因此,如果一个函数想用 a 做某事Vehicle而不切掉它的额外标识,它必须使用指针或引用Vehicle作为函数参数类型或返回类型。但是此时您不再有“在堆栈帧之间复制的值类型”。

于 2014-09-03T15:13:06.170 回答
0

由于结构是值类型,因此您应该将它们复制到函数中并返回。因此,您可以使用派生结构调用非变异方法,但无法从中返回派生值,所以

struct Vehicle {
   var color: Color

   mutating func paintWhite() {
       self.color = .White
   } 
}


struct Lorry: Vehicle ...

var lorry = Lorry(color:.Blue)
lorry.paintWhite() // <- wouldn't work, as paintWhite takes inout Vehicle

如果没有调用变异方法的能力,结构将变得不那么有用并且更加混乱。

于 2014-09-04T19:14:10.863 回答