在最近的一次开发人员会议上,简要讨论了Swift中的struct继承(或者更确切地说,Swift中缺乏struct继承的问题)。我认为Swift不支持struct继承的原因是:
structs是值类型。struct的大小可能有所不同(例如,如果Lorry从Vehicle继承,Lorry添加.weightCapacity,那么Lorry将需要比Vehicle更多的空间)我认为,正是由于这些复杂的因素,Swift不允许struct继承,这可能会在涉及struct的每个函数调用中添加额外的操作,从而降低性能。这个推理正确吗?
但我想到了C++。C++确实允许struct继承,C++非常注重性能。这使我认为我对于Swift不允许struct继承的推理是错误的。C++如何在不影响性能的情况下实现struct继承?
发布于 2014-09-03 15:13:06
C++如何在不影响性能的情况下实现结构化继承?
在C++中,编译器总是知道struct的大小。但是,当通过值复制基类时,对象将被“切片”:只复制基类的成员,而新对象与原始对象的派生类没有任何关联。
因此,如果一个函数想要在不分割其额外标识的情况下对Vehicle做一些事情,它必须使用一个指针或对Vehicle的引用作为函数参数类型或返回类型。但此时,您不再有“在堆栈帧之间复制值类型”。
发布于 2014-09-04 19:14:10
因为结构是值类型,所以应该将它们复制到函数和back中。因此,您可以使用派生的结构调用非变异方法,但是无法从它返回派生值,因此
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如果没有调用变异方法的能力,那么结构就不会那么有用,也会更加混乱。
https://stackoverflow.com/questions/25647401
复制相似问题