CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

派生类对象与父类对象赋值不相容?

楼主wvins(逸岚)2006-03-01 19:38:10 在 Delphi / VCL组件开发及应用 提问

我的函数原型如下:  
  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

相关问题

  • 派生类?
  • 类的实例的赋值
  • 类变量间的赋值
  • 赋值给sheet类的问题
  • datetime 类型如何赋值
  • 如何派生CObject类的派生类
  • 求CListCtrl派生类
  • 如何为记录类型赋值???
  • static const 能在类中赋值吗?
  • 如何为widechar类型字符赋值?

关键词

  • 对象
  • 如下
  • newsize
  • tobject
  • 引用
  • procedure f
  • begin writeln
  • aa
  • ok
  • var

得分解答快速导航

  • 帖主:wvins
  • netfly
  • yyfhz
  • GARNETT2183
  • zhangl_cn

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo