Цель C: есть ли разница между этими двумя утверждениями? - PullRequest
2 голосов
/ 10 марта 2011

Настройка

@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;

Ответы [ 4 ]

3 голосов
/ 10 марта 2011

Обработка подкласса как его родительского класса довольно распространена и безопасна. (Если вы не злоупотребляете наследованием в своем дизайне.) Приведение не делает ничего лишнего во время выполнения и не требуется во время компиляции; для машины это абсолютно бесполезно.

0 голосов
/ 10 марта 2011

Хммх Предупреждение: несовместимые типы Objective-C, инициализирующие 'struct AbstractClass *', ожидаемые 'struct ConcreteClass *'

0 голосов
/ 10 марта 2011

Ваше приведенное утверждение действительно только в том случае, если base действительно указывает на instance of ClassSuper.Поскольку ClassBase включает в себя больше типов, чем ClassSuper ваше приведение может произойти сбой во время выполнения !

Ваше первое утверждение, однако, не будет ошибочным, потому что Objective-C не заботится о типево время назначения.Таким образом, ваш ClassSuper* super больше id super во время выполнения.Тем не менее, приведение будет проверено и выкинет ошибки, если не выполнено.

0 голосов
/ 10 марта 2011

Вы получите предупреждение компилятора о ClassSuper* super = base;, поскольку не каждый экземпляр ClassBase является экземпляром ClassSuper. Поэтому, если вы действительно знаете, что делаете, вам следует сделать явное приведение, чтобы компилятор не скулил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...