派生类对象与父类对象赋值不相容?
我的函数原型如下:
newSize(var ctrl: TObject;AWidth,AHeight: Integer);
调用过程如下:
newSize(Panel,width,height);
编译信息如下:
Types of actual and formal var parameters must be identical
实参与形参必须一致!
该为如下:
newSize(TObject(Panel),width,height);
通过编译,得如下结论:
至少在这种情况下,子类对象(引用)不能赋值给父类对象(引用)
问题点数:20、回复次数:9Top
1 楼zhangl_cn(和尚-修行)回复于 2006-03-01 19:44:21 得分 0
newSize(var ctrl: TObject;AWidth,AHeight: Integer);
/////////////////////////
把var去掉再试试Top
2 楼wvins(逸岚)回复于 2006-03-01 19:47:00 得分 0
我写了一段测试代码如下:
program Child2Parent;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
A = class
private
public
end;
var
aa: A;
procedure f1(var o: TObject); //传引用
begin
WriteLn('Ok');
end;
procedure f2(o: TObject); //传值
begin
WriteLn('Ok');
end;
procedure f3(const o: TObject); //传常量
begin
WriteLn('Ok');
end;
begin
aa:= A.Create;
// f1(aa); (*<----------仅就这一段通不过编译*)
f2(aa);
f3(aa);
end.
高手讲解一下!!Top
3 楼wvins(逸岚)回复于 2006-03-01 19:49:50 得分 0
把var去掉再试试
//==============================================
如果我没有理解错误的话
var指传引用,即值的改变会影响到实参.
什么都没有即默认的传值,即复制过去.
const则是传常量,更加是不能修改
--------------------------------
我要改变这个变量的值,应该是不能去掉的吧?Top
4 楼netfly(支点)回复于 2006-03-02 14:51:28 得分 5
在DELPHI里,OBJECT的属性是可以变的,所以传递OBJECT时一定要注意,这也是JAVA里有些人要求不传递本身OBJECT的问题所在Top
5 楼yyfhz(火山)回复于 2006-03-02 15:23:41 得分 5
既然是var TObject吗,就表示可以传出某个TObject咯。
TPanel 固然是TObject,但反过来可就不一定了,因此才会保护性的报这么个错误啦Top
6 楼GARNETT2183(KingWolves (http://kevin-lu.blogspot.com))回复于 2006-03-02 15:41:06 得分 5
对像本身就是引用传递...不要加var
常用类型就是var。。。比如:Integer,String,Single等..Top
7 楼wvins(逸岚)回复于 2006-03-10 13:29:29 得分 0
我怎么没想到呢!
学习
这和java是类似的Top
8 楼wvins(逸岚)回复于 2006-03-10 13:29:48 得分 0
晚上结贴Top
9 楼zhangl_cn(和尚-修行)回复于 2006-03-10 14:02:52 得分 5
newSize(var ctrl: TObject;AWidth,AHeight: Integer);
当参数里含有 var 修饰符时,编译器会进行严格的类型检查,即使是
type
TMyObject=TObject;
newSize(var ctrl: TMyObject;AWidth,AHeight: Integer);
var
aObj:TObject;
//.....
newSize(aObj,10,10) //报错
编译也不会通过Top




