Objective-C类继承与分配

Objective-C类继承与分配,objective-c,inheritance,alloc,Objective C,Inheritance,Alloc,给定以下行,其中Square是矩形的子类: Rectangle *thisObject = [[Square alloc] init]; Square *thisObject = [[Square alloc] init]; 此对象包含: 1.正方形对象的所有实例变量。 2.在Square对象中实现的所有实例方法。 3.矩形对象的所有实例变量。 4.矩形对象中实现的所有实例方法 给定以下行,其中Square是矩形的子类: Rectangle *thisObject = [[Square al

给定以下行,其中Square是矩形的子类:

Rectangle *thisObject = [[Square alloc] init];
Square *thisObject = [[Square alloc] init];
此对象包含: 1.正方形对象的所有实例变量。 2.在Square对象中实现的所有实例方法。 3.矩形对象的所有实例变量。 4.矩形对象中实现的所有实例方法

给定以下行,其中Square是矩形的子类:

Rectangle *thisObject = [[Square alloc] init];
Square *thisObject = [[Square alloc] init];
此对象包含: 1.正方形对象的所有实例变量。 2.在Square对象中实现的所有实例方法。 3.矩形对象中实现的所有实例方法


有分歧吗?

没有,这些是相同的。这两者之间的唯一区别是,如果您试图向thisObject发送一条矩形消息,则编译器会发出警告。但这只是一个警告,发送的消息实际上在运行时起作用。

你说得对。指针的类型与对象本身的类型无关。它只是让编译器更容易检查类型。您也可以对所有对象使用id,它们的行为不会改变。

我不同意。您没有注意到第二个也包含矩形对象的所有实例变量

两个实例完全相同。实例是,除了类集群之类的东西之外,您将它们分配为什么,而不是您以后声称它们是什么

这两个实例都是方形对象

该行:

Monkey *george = [[Square alloc] init];
没有做任何事情让乔治变成猴子。他是个正直的人。如果您向他发送Monkey不响应的消息,编译器将警告您,但如果这些消息是方形消息或任何方形超类,他将作为方形响应

若您发送george Monkey消息,您将得到关于找不到选择器的运行时错误。除非您的Monkey消息恰好与一个方形消息匹配,这将与它们的公共超类中的方法匹配

这就是多态性。你可以说乔治是一只猴子,或者是一个圆圈,或者只是一个id,但他会说他是一个正方形