主题:重写和隐藏基类成员的区别?
lfq721
[专家分:0] 发布于 2008-01-14 22:07:00
请问重写和隐藏基类成员对实用类的对象具体有什么影响?还有virtual基类,派生类可以用override重写。重写之后是不是派生类的对象就不能访问基类的成员了?各位大虾,指教一下吧~
回复列表 (共2个回复)
沙发
jzyray [专家分:20610] 发布于 2008-01-15 14:08:00
FAQ有相关问题索引
板凳
guyaping1234 [专家分:0] 发布于 2008-01-20 18:34:00
要理解overide, overload, inherence的区别
inherence就是继承,OO里的基本概念。
overide是指派生类中有一个和基类同名的函数(只要同名就算),我们就称“类B override了类A的fun()成员函数”。overide只能用于虚函数的重写。对于非虚拟函数进行 override 的后果叫做“覆盖”。
overload是指在同一个namespace中,有多个同名但不同参数的函数。不同的类之间不存在overload关系。
因此,override和overload是截然不同的:override发生于派生类与基类之间,而overload只发生于一个类或者namespace的范围之内。
---------------------------------------------------------------
先说override吧,看下面的例子:
type
TFigure = class
procedure Draw; virtual;
end;
TRectangle = class(TFigure)
procedure Draw; override;
end;
TEllipse = class(TFigure)
procedure Draw; override;
end;
你看到了吧,最原始的父类TFigure有一个draw方法,然后继承这个类的TRectangle也有一个Draw方法,这个方法与父类的Draw同名,所以就等于重载了父类方法,但这样的重载要求父类的方法是virtual的。
再说overload:
type
T1 = class(TObject)
procedure Test(I: Integer); overload; virtual;
end;
T2 = class(T1)
procedure Test(S: string); reintroduce; overload;
end;
看上面的例子,T1有一个Test方法,T2也有一个叫Test的方法,但两个方法名称相同,只是参数不一样,这样为了就需要overload声明,用来证明这个叫Test方法可能有多种不同的调用,编译时是根据参数类型做判断的。
我来回复