Хорошо, во-первых, ваш тестовый код неверен, потому что вы установили число сохранения 2001 в 8-битном целом числе.Во-вторых, ваш код не запускается, потому что вы пытаетесь вызвать setSavingNumber: andOffer: для BankAccount вместо объекта Saving, поэтому он не может найти селектор для этого метода во время выполнения.Спасибо Дэвиду за указание на это.
При реализации BankAccount :: copyWithZone вы использовали alloc-init и вернули объект, что нормально.При реализации Savings :: copyWithZone вы вызываете super copyWithZone.То, что вы получите, это объект типа BankAccount, поэтому вы не можете использовать setSavingNumber: andOffer: on.Поскольку вы использовали alloc-init в базовом классе, вы должны также использовать alloc-init и setMethods в классе Savings.
Чтобы избежать дублирования кода, я бы рекомендовал реализовать initWithBankAccount в BankAccount и то же самоев Savings.
Тогда в copyWithZone у вас будет
return [[BankAccount allocWithZone:zone] initWithBankAccount:self];
и
return [[Savings allocWithZone:zone] initWithSavings:self];
Хотя вы должны убедиться, что в initWithSavings вы вызываете либо
self = [super initWithBankAccount:savings];
или вы вызываете прямой init и копируете инициализацию базового элемента.
Посмотрите на Реализация копирования объекта из Руководства по программированию для управления памятью.