关于父类和子类(50分)

  • 主题发起人 主题发起人 yherxl
  • 开始时间 开始时间
Y

yherxl

Unregistered / Unconfirmed
GUEST, unregistred user!
比方说有父类TANIMAL和子类TDOG,
变量申明:VAR MYANIMAL:TANIMAL;
赋值: MyAnimal:=TDog.create;

那么,对象MyAnimal所具有的属性方法是TANIMAL 还是 TDOG的
好象方法是TANIMAL的,那数据是哪个的?
 
不一定。。。。
使用virtual和不使用效果是不同的
请去看看面向对象中的虚方法就清楚了
 
是TANIMAL类型。MyAnimal只不过是用TDog的create方法创建的TANIMAL实例。
如果你访问MyAnimal中TANIMAL类没有的属性,应该会出错。我的理解,我也没试过。
 
那么TDOG有,TANIMAL所没有的数据和方法,MYANIMAL是否拥有,请详细说明一下。谢谢
 
某个类的所有子类和父类的入口都是固定的。所以只要取得这个入口的指针就可以找到这个对象。
T*.create返回的就是这个指针。所以,该指针指向的对象可以是该类本身或其所有父类。
即指向Tanimal &amp
TDog
 
TANIMAL所没有的数据和方法,MYANIMAL应该没有。你如果调用可能会出错,
说可能是因为我没试过,而不是有时出错,有时不出。
 
关键是virtual。
加了以后访问速度会变快。
 
To nunimao and j5203
如果使用多态(ABSTRACT,VIRTUAL OR DYNAMIC),变量MyAnimal类型设为
1.TDOG 或 2.TANIMAL
MyAnimal:=TDOG.create;

那么这两种情况下,对象MyAnimal有何区别?
 
我觉得这与c++的知识更为接近一些
myanimal可以认为是TDog的实例化,它具有TDog的所有数据和方法,而由于TDog是TAnimal
的子类,myanimal同样可以具有Tanimal的数据和方法,当然,如果TDog和TAnimal有相同的
方法,根据虚函数的概念可以处理。
 
这是多态性的一个体现,父类可以指向它的子类的对象指针。
所以,如果在父类中是虚方法,子类重载后,在将子类的对象指针赋给父类之后
该方法指针是子类的,而不是父类。
 
sorry,我说错了。应该是
type

TAncestor = class
Value: Integer;
end;

TDescendant = class(TAncestor)

Value: string
// hides the inherited Value field
end;

var

MyObject: TAncestor;

begin

MyObject := TDescendant.Create;
MyObject.Value := 'Hello!'
// error
TDescendant(MyObject).Value := 'Hello!'
// works!
end;
 
abstract,virtual是为子类函数重载创造便利。
abstract只告诉编译器该处有个函数入口,但是没有函数体。
virtual则是既有入口,又有函数体的。用override子类同名函数就可以覆盖父类的函数。

大多event里都有个叫sender的参数,它是tobject类型。
由sender可以as成很多类,其实sender在这儿提供的就是一个指针。
as告诉编译器寻找相应的成员函数入口。所以只要是子类,都可以由父类指针获得。

所以你提的问题就象一个路牌指向某条街,no.1是父类,no.2,3,。。。都是子类,
由路牌可以找到no.1,加上相对位置可以继续找到no.2,3。。。。所以,
你非要说指针指向的是什么,那么我回答都可以(在同一父,子类中)。

 
声明成什么Delphi就认为它是什么。用TDog.create创建的Myanimal
实际上已经具有了TDog类的属性,但是Delphi仍认为它是你
声明的那个类的实例,也就是Tanimal的实例,这时你给Myanimal赋TDog特有的属性
值就会发生错误。而你通过强制类型转换TDog(Myanimal),把Myanimal
转换为TDog类型后,就可以给TDog特有的属性赋值了。
 
我搞懂了,做了个试验。结果是:
1。变量申明成什么类型,他就具有那个类型的数据和方法。
2。使用父:=子,则父只是子的一个子集。为了让父有与子一样的表现,必须:
3。在父类中申明与子类相同的抽象虚拟方法,这样才能使用子类的方法
4。使用类型转换,才能使用子类的数据

不知有无差错,请各位大侠指正
ps:关了compiler的代码优化,在evaluate中观察某个表达式,仍然说‘expression inaccessable’
是何原因。谢谢
 
多人接受答案了。
 
后退
顶部