0

当我执行下面的代码时,为什么我会收到底部列出的输出,我有点(实际上,很多)困惑。Insect 和 Mammal 实例应该是具有不同实例变量的两个独立对象。对 [super initAttributes] 的两个调用都应该独立地初始化每个实例,每个实例都通过了self。那么为什么昆虫哺乳动物实例在显示时具有相同的值?似乎两个实例都指向内存中的同一个对象。

任何帮助将不胜感激。谢谢!

动物

//Interface

#import <Foundation/Foundation.h>

@interface Animal : NSObject

-(id) initAttributes: (NSString *) initName Legs: (int) initLegs Arms: (int) initArms;
-(void) display;

@end

//Implementation

#import "Animal.h"

@implementation Animal

NSString *name;
int legs, arms;

-(id) initAttributes: (NSString *) initName Legs: (int) initLegs Arms: (int) initArms
{
    self = [super init];

    if (self)
    {
        name = initName;
        legs = initLegs;
        arms = initArms;
    }

    return self;
}

-(void) display
{
    NSLog(@"Name: %@ Legs: %i Arms: %i", name, legs, arms);
}

@end

昆虫类

//Interface

#import "Animal.h"

@interface Insect : Animal

-(id) initInsect: (NSString *) initName;

@end

//Implementation

#import "Insect.h"

@implementation Insect

-(id) initInsect: (NSString *) initName
{
    self = [super initAttributes: initName Legs: 8 Arms: 0];

    if (self)
    {
    }

    return self;
}

@end

哺乳动物类

//Interface

#import "Animal.h"

@interface Mammal : Animal

-(id) initMammal: (NSString *) initName;

@end

//Implementation


#import "Mammal.h"

@implementation Mammal

-(id) initMammal: (NSString *) initName
{
    self = [super initAttributes: initName Legs: 2 Arms: 2];

    if (self)
    {
    }

    return self;
}

@end

主要的

#import <Foundation/Foundation.h>
#import "Insect.h"
#import "Mammal.h"

int main (int argc, const char * argv[])
{

    @autoreleasepool {

        Insect *insect = [[Insect alloc] initInsect: @"Spydor"];
        Mammal *mammal = [[Mammal alloc] initMammal: @"Platypus"];

        [insect display];
        [mammal display];
    }

    return 0;
}

输出

名称:鸭嘴兽腿:2 手臂:2
名称:鸭嘴兽腿:2 手臂:2

4

1 回答 1

1

我假设这是家庭作业,所以这里有一个提示:错误在于您的变量声明。不要将全局变量用于多态性。

于 2012-06-03T14:16:52.903 回答