设置:
@interface Base : NSObject {}
@end
@interface Subclass : Base {}
@end
…
Subclass* sub = …;
之间是否存在差异:
// No explicit cast.
Base* base = sub;
和
// Explicit cast, but does this actually DO anything different at runtime?
Base* base = (Base*) sub;
答案 0 :(得分:3)
像处理父类一样处理子类是非常常见且安全的。 (除非你在设计中滥用继承。)演员在运行时不做任何额外的事情,在编译期间不需要;就机器而言,它完全没用。
答案 1 :(得分:0)
您 会收到有关ClassSuper* super = base;
的编译器警告,因为并非每个ClassBase
实例都是ClassSuper
个实例。所以如果你真的知道你做了什么,你应该做出明确的演员来阻止编译器抱怨。
答案 2 :(得分:0)
Hmmh 警告:不兼容的Objective-C类型初始化'struct AbstractClass *',期望'struct ConcreteClass *'
答案 3 :(得分:-1)
只有当base
真正指向instance of ClassSuper
时,您的演示声明才有效。由于ClassBase
包含更多类型,因此ClassSuper
您的广告可能会在运行时失败!
您的第一个声明不会失败,因为Objective-C在分配期间并不真正关心类型。因此,ClassSuper* super
在运行时期间更像id super
。演员虽然会被证实并且如果没有履行则会抛出错误。